QVariant只接受QList而不接受QVector或QLinkedList的原因是什么



QVariant似乎接受QList<QVariant>,而不是QVector<QVariant>QLinkedList<QVariant>。这仅仅是因为它将QListQVectorQLinkedList视为基本相似(抽象意义上)的数据结构吗?

我正在将和std::vector添加到QVariant中。如果只使用Qt API而不使用手动转换,则需要两种转换:

  1. std::vectorQVector
  2. QVectorQList

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专家,所以我可能会放弃这个。但希望这至少能让你朝着正确的方向思考。

相关内容

  • 没有找到相关文章

最新更新