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

joh*_*ers 6 qt qml qtquick2

我有一个包含许多数据成员的C++对象指针.我需要所有QML版本.一种显而易见的方法是Q_PROPERTY为每个成员创建一个,以便可以通过QML单独访问它们.但是,如果我们谈论的是数十个数据成员,那么很多行Q_PROPERTY,更不用说必须在QML中单独处理这些作为单独的属性(特别是如果处理每个属性的"on changed"信号).

我想知道是否有可能制作一个Q_PROPERTY包含我需要的所有数据成员的单一内容.但我不清楚的是,QML支持的类型与您可以列出的类型之间明显不匹配Q_PROPERTY.例如,在QML中,我们有一个基本的,string但它在C++中相应的lising Q_PROPERTY必须是QString:

 Q_PROPERTY(QString datastring READ showdata NOTIFY datastringChanged)
  //in QML, `datastring` is just a plain string
Run Code Online (Sandbox Code Playgroud)

是否会有更复杂的属性,如列表或数组,可以轻松匹配?QML有一个list类型,而C++有,QList但这些是相同的吗?在哪里可以找到C++和QML之间的兼容类型列表?

另一方面,为每个数据成员设置单独的Q_PROPERTY可能是更好的性能(我的数据很大且经常变化),因为QML可能不需要解析任何东西.

Tho*_*ire 4

是否有更复杂的属性(例如可以轻松匹配的列表或数组)?QML 有列表类型,C++ 有 QList,但它们是同一件事吗?在哪里可以找到 C++ 和 QML 之间的兼容类型列表?

查看C++/JS 数据转换帮助页面。我认为清单漏掉了这一点QList<QObject*>也是有可能的。

另一方面,为每个数据成员设置单独的 Q_PROPERTY 可能会带来更好的性能(我的数据很大并且经常变化),因为 QML 也许不需要解析任何内容。

也许,是的,取决于您的性能需求。从 QML/JS 访问时,C++ QList 会转换为 JavaScript 列表。这确实是一点转换开销。此外,如果列表中的某个项目发生更改,您需要为完整属性发出通知信号,并且需要重新评估使用该列表的每个 JS 绑定,这将再次进行许多列表转换。如果拥有更细粒度的属性可能会更好,但这实际上取决于情况

顺便说一句,Qt 5.1 现在有了MEMBER,这使得编写 Q_PROPERTY 变得更容易一些。