使用C ++编译时安全性更改QML属性

时间:2017-03-21 14:47:26

标签: c++ qt qml

是否可以通过编译时安全性从C ++调用QML组件中的函数或更改属性?

目前更改属性的建议是使用以下任何功能:

QQmlProperty::write(object, "someNumber", 100);
QMetaProperty::write(object, "someNumber", 100) 
object->setProperty("someNumber", 100);

其中object是QML组件的QObject *,其具有名为someNumber的属性。有关详细信息,请参阅http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

目前我可以将"someNumber"更改为"otherNumber"而不会出现任何编译错误,即使没有名为otherNumber的属性。

甚至可以将数字100更改为另一种类型,例如"100"(字符串文字),而不会出现任何编译错误,即没有类型检查。当您尝试从C ++调用QML组件中定义的函数时,会发生类似的问题。

我知道如果它们无法转换类型或者如果属性不存在但是我正在寻找编译时错误检查,那么每个函数都将返回false。

有谁知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

这完全取决于this.dataFRM.get('modelDetail.0.modelArray')

的C ++类型

如果您可以访问其声明(标题),则可以转换为具体类型并直接调用setter方法,而不是通过抽象属性API。

但是,从C ++设置QML对象属性通常不是一个好主意,因为你依赖于对象存在并且属于某种类型。

更好的方法是将数据作为属性提供给您公开给QML并在QML端处理赋值的对象。 然后,在C ++控件下,公开对象的API就完整了,因此您可以始终使用相应的类型检查来调用setter。

答案 1 :(得分:0)

由于Qt元对象系统依赖于QVariant,所以不可能,因此传递给它的所有数据将首先转换为QVariant,然后仅转发给接收方。对话是否失败只会在运行时知道。

但是你可以创建一个C ++类,在其中你将从C ++修改数据并将其导出到QML。