如何有效地将单个对象的许多C ++数据成员公开给QML?

时间:2013-12-10 01:22:29

标签: qt qml qtquick2

我有一个包含许多数据成员的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可能不需要解析任何内容。

1 个答案:

答案 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更容易。