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

标签 qt qml qtquick2

我有一个包含许多数据成员的 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/

相关文章:

qt - 是否可以在不使用成员函数的情况下实现 Q_PROPERTY READ/WRITE 访问器?

qml - 如何在 QML ScrollView 中设置滚动动画?

c++ - 从 C++ 检测静态添加的 QML 子项

c++ - 某些平台上的变量初始化并非随处可见

c++ - Qt WheelEvent,如果按下滚轮如何获取?

c++ - 将 QQmlListProperty 作为参数从 QML 传递到 C++

qt - QML 几个具有主动焦点/键盘快捷键控制的项目

qt - 在 QML 中将 TabButton 动态添加到 TabBar

c++ - Qwt 重新缩放轴

qt - 从 QML 到 C++ 插槽的信号,找不到 QML 信号