在调用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时,在操作该类型的项时,它会调用其默认构造函数、复制构造函数和析构函数。因此,对于类和对象使用它没有问题。
QVariant
识别为项目集合。我正在使用与QVariant
一起工作的QJson,不知道如何处理"用户定义"类型,例如std::vector
。 - Alan TuringQList是目前使用最广泛的容器类型,为了避免让QVariant接口更加复杂,不会为其他容器类型添加重载。无论如何,您的问题似乎不在于QVariant不支持QVector(它可以通过一些工作实现),而是QJson不支持。我怀疑调用QVector::toList()会导致显著的性能开销。
对于这样的模板类,您需要单独使用元系统注册每个特定的实例。显然,Trolls感觉需要使用 QList<QVariant>
,但没有使用其他任何内容,因此他们只注册了一个。您也可以自己注册它们,没有具体的理由不允许这样做。
我不能百分之百确定QVariant的实现,但我认为一个QVariant的大小直到运行时才被确定。这意味着如果你尝试写 QVector< QVariant >,编译器不知道要分配多少空间,所以会报错。LinkedList也是一样的。QList可以工作是因为它的实现严格依赖于指针。
我敢打赌,QVector< QVariant* >会编译得很好。
大警告:我不是Qt专家,所以我的理解可能有误。但希望至少能让你朝着正确的方向思考。