【发布时间】:2017-08-13 07:33:36
【问题描述】:
是否可以在具有编译时安全性的 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。
有谁知道如何做到这一点?
【问题讨论】:
-
为此您需要一个额外的工具,而 AFAIK 不存在。它不能成为“正常”构建的一部分,因为 QML 文件可以在运行时从磁盘加载,在这种情况下,没有什么可以阻止它们在编译后被更改。但是当然可能有一个工具,它可以根据当前的 QML 文件检查 C++ 代码,并抱怨这样的东西......
-
@hyde QML 文件不需要是 JIT,因为我们使用的是 Qt Quick Compiler,我认为它可以设计为在链接器阶段检测到它。不过感谢您的评论。
-
我认为 QML 组件实例仅使用动态属性(即,没有具有非动态属性的特定 C++ 类,即使您使用预编译的 QML,至少 AFAIK)。 QML 编译器当然可以导出已知属性的列表,然后可能会有一个工具根据列表检查 C++ 代码,但同样,AFAIK 还没有人编写过这样的工具。