QVariant似乎接受QList<QVariant>
,而不是QVector<QVariant>
或QLinkedList<QVariant>
。这仅仅是因为它将QList
、QVector
和QLinkedList
视为基本相似(抽象意义上)的数据结构吗?
我正在将和std::vector
添加到QVariant
中。如果只使用Qt API而不使用手动转换,则需要两种转换:
- 从
std::vector
到QVector
- 从
QVector
到QList
PS:我知道我可以用这个直接把std::vector
加到QVariant
上,但我相信在那种情况下,它不会知道它是一个对象向量。
在调用qRegisterMetaType函数后,您可以将所有内容存储在QVariant中。
因此,如果您调用qRegisterMetaType<std::vector<SomeObject> >("std::vector<SomeObject>");
,QVariant将存储std::vector。从执行函数T QVariant::value () const
的它读取这样的值,用于写入使用函数void QVariant::setValue ( const T & value )
附言:我知道我可以用这个直接把std::vector添加到QVariant中,但我相信在这种情况下,它不会知道它是一个对象的向量。
当您将类型注册到QVariant时,它会在操作该类型的项时调用它的默认构造函数、复制构造函数和析构函数。因此,将它与类和对象一起使用是无害的。
因为QList是迄今为止最常用的容器类型,为所有其他类型添加重载会使QVariant接口比现在更复杂。无论如何,你的问题似乎不是QVariant不支持QVector(它只做了一点工作),而是QJson不支持。我怀疑对QVector::toList()的额外调用是否会导致显著的性能开销。
对于像这样的模板化类,您必须分别向元系统注册每个特定的实例化。显然,巨魔觉得有必要使用QList<QVariant>
,但其他人都没有,所以他们只注册了一个。没有什么具体的原因你不能自己注册。
我不能100%确定QVariant的实现,但我相信QVariant大小要到运行时才能确定。这意味着,如果您尝试将QVector<QVariant>编译器不知道要分配多少空间,所以它报告了一个错误。LinkedList也是如此。QList之所以有效,是因为它的实现严格依赖于指针。
我打赌你会发现QVector<QVariant**编译得很好。
大警告:我不是Qt专家,所以我可能会放弃这个。但希望这至少能让你朝着正确的方向思考。