我有一个包含许多数据成员的C ++对象指针。我需要所有QML版本。一个显而易见的方法是为每个成员创建一个Q_PROPERTY
,以便可以通过QML单独访问它们。但是,如果我们谈论的是数十个数据成员,那么很多行Q_PROPERTY
,更不用说必须在QML中单独处理这些作为单独的属性(特别是如果处理“on changed”信号)对于每个属性)。
我想知道是否可以制作一个包含我需要的所有数据成员的Q_PROPERTY
。但我不清楚的是the types that QML supports与您在Q_PROPERTY
中列出的类型之间明显不匹配。例如,在QML中,我们有一个基本的string
,但它在C ++ Q_PROPERTY
中的相应升级必须是QString
:
Q_PROPERTY(QString datastring READ showdata NOTIFY datastringChanged)
//in QML, `datastring` is just a plain string
是否会有更复杂的属性,如列表或数组,可以轻松匹配? QML有一个list
类型,C ++有QList
但这些是一样的吗?在哪里可以找到C ++和QML之间兼容类型的列表?
另一方面,为每个数据成员提供单独的Q_PROPERTY可能会有更好的性能(我的数据很大且经常变化),因为QML可能不需要解析任何内容。
答案 0 :(得分:4)
是否会有更复杂的属性,如列表或数组 容易匹配? QML有一个列表类型,C ++有QList但是 这些同样的事情?我在哪里可以找到兼容类型的列表 在C ++和QML之间?
查看C++/JS data conversion help page。我认为列表错过了QList<QObject*>
也是可能的。
另一方面,为每个数据成员提供单独的Q_PROPERTY 可能会有更好的表现(我的数据很大而且经常 因为QML不需要解析任何东西,或许。
也许,是的,取决于您的表现需求。从QML / JS访问时,C ++ QList将转换为JavaScript列表。这确实是一点转换开销。此外,如果列表中的项目发生更改,则需要为完整属性发出通知信号,并且需要重新评估使用该列表的每个JS绑定,这将再次进行许多列表转换。 可以通过拥有更细粒度的属性来提高效果,但这实际上取决于它。
顺便说一句,Qt 5.1现在有MEMBER
,这使得编写Q_PROPERTYs更容易。