有没有理由说QVariant只接受QList而不接受QVector和QLinkedList

时间:2011-05-30 15:03:06

标签: c++ qt stl vector qvariant

QVariant似乎接受QList<QVariant>而非QVector<QVariant>QLinkedList<QVariant>。这只是因为它将QListQVectorQLinkedList视为从根本上相似(在抽象意义上)的数据结构?

我正在向std::vector添加QVariant。如果仅使用Qt API而非手动转换,则需要进行两次转换:

  1. std::vectorQVector
  2. QVectorQList
  3. PS:我知道我可以直接用thisstd::vector添加到QVariant,但我相信在这种情况下,它不会知道它是对象的向量。 / p>

4 个答案:

答案 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专家,所以我可能会对此不以为然。但希望至少这会让你思考正确的方向。