QVariant为什么只接受QList而不是QVector或QLinkedList?

7

QVariant似乎接受QList<QVariant>而不是QVector<QVariant>QLinkedList<QVariant>。这是因为它认为QListQVectorQLinkedList在抽象意义上是类似的数据结构吗?

我正在向QVariant中添加一个std::vector。如果只使用Qt API而没有手动转换,则需要进行两次转换:

  1. std::vectorQVector
  2. QVectorQList

PS:我知道我可以使用此方法直接将std::vector添加到QVariant,但我相信在那种情况下,它不会知道它是对象的向量。


我对你的问题感到困惑。首先,你讨论了QVariants的列表和向量,然后又讨论了在QVariant中存储std::vector?这里有两个不同的问题吗? - Nathanael
第一个问题是重点。第二个陈述只是描述我使用它的目的。 - Alan Turing
4个回答

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时,在操作该类型的项时,它会调用其默认构造函数、复制构造函数和析构函数。因此,对于类和对象使用它没有问题。


是的,但问题是我希望另一个库(期望Qt类型QJson)将QVariant识别为项目集合。我正在使用与QVariant一起工作的QJson,不知道如何处理"用户定义"类型,例如std::vector - Alan Turing

7

QList是目前使用最广泛的容器类型,为了避免让QVariant接口更加复杂,不会为其他容器类型添加重载。无论如何,您的问题似乎不在于QVariant不支持QVector(它可以通过一些工作实现),而是QJson不支持。我怀疑调用QVector::toList()会导致显著的性能开销。


2

对于这样的模板类,您需要单独使用元系统注册每个特定的实例。显然,Trolls感觉需要使用 QList<QVariant>,但没有使用其他任何内容,因此他们只注册了一个。您也可以自己注册它们,没有具体的理由不允许这样做。


0

我不能百分之百确定QVariant的实现,但我认为一个QVariant的大小直到运行时才被确定。这意味着如果你尝试写 QVector< QVariant >,编译器不知道要分配多少空间,所以会报错。LinkedList也是一样的。QList可以工作是因为它的实现严格依赖于指针。

我敢打赌,QVector< QVariant* >会编译得很好。

大警告:我不是Qt专家,所以我的理解可能有误。但希望至少能让你朝着正确的方向思考。


对于任何类型,其大小必须在编译时知道。如果直到运行时才知道大小,则必须依赖堆,在这种情况下,实际结构的大小仍将被视为指针的大小。 - Dennis Zickefoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接