我有一个包含许多数据成员的 C++ 对象指针。我需要它们都在 QML 中可用。一种明显的方法是创建一个 Q_PROPERTY
为每个成员,以便他们可以通过 QML 单独访问。但是,如果我们谈论的是数十个数据成员,那么 Q_PROPERTY
的行数就很多了。 ,更不用说必须在 QML 中将这些作为单独的属性单独处理(尤其是在处理每个属性的“更改”信号时)。
我想知道是否可以制作单个 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 可能不需要解析任何东西。
最佳答案
Would there be more complex properties like lists or arrays that can be easily matched? QML has a list type and C++ has the QList but are these the same thing? Where can I find a listing of compatible types between C++ and QML?
看看C++/JS data conversion help page .我认为列表错过了
QList<QObject*>
也是可能的。On the other hand, having individual Q_PROPERTY for each data member could likely be better performance (my data is large and often changing) since the QML would not need to parse anything, perhaps.
也许,是的,取决于您的性能需求。当从 QML/JS 访问时,C++ QList 会转换为 JavaScript 列表。这确实是一些转换开销。此外,如果列表中的某个项目发生更改,您需要为完整属性发出通知信号,并且需要重新评估使用列表的每个 JS 绑定(bind),这将再次进行许多列表转换。拥有更细粒度的属性可能会更好,但这确实取决于。
顺便说一句,使用 Qt 5.1 现在有
MEMBER
,这使得编写 Q_PROPERTY 更容易一些。
关于qt - 如何有效地将单个对象的多个 C++ 数据成员公开给 QML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484295/