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