是否可以使用编译时安全从C++调用QML组件中的函数或更改属性?使用编译时安全从C++更改QML属性
当前建议更改属性是使用任何的以下功能:
QQmlProperty::write(object, "someNumber", 100);
QMetaProperty::write(object, "someNumber", 100)
object->setProperty("someNumber", 100);
其中对象是QObject *
到具有称为someNumber
属性QML组件。有关更多信息,请参阅http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html。
目前,我可以将"someNumber"
更改为"otherNumber"
,即使没有任何编译错误,即使没有属性otherNumber
。
甚至可以将数字100
更改为另一种类型,如"100"
(字符串文本),而不会出现任何编译错误,即无类型检查。当您尝试从C++调用QML组件中定义的函数时,会出现类似的问题。
我知道每个函数都会返回false,如果它们无法转换类型或者属性不存在,但我正在寻找编译时错误检查。
有没有人有任何想法如何做到这一点?
你需要一个额外的工具,AFAIK一个不存在。它不能成为“普通”构建的一部分,因为QML文件可以在运行时从磁盘加载,在这种情况下,没有什么能够防止它们在编译后被更改。但当然有* *可能是一个工具,它检查C++代码对当前的QML文件,并抱怨这样的东西... – hyde
@hyde QML文件不需要必须是JIT,因为我们正在使用Qt Quick Compiler我认为它可以设计成在链接器阶段检测到它。感谢评论。 –
我认为QML组件实例只使用动态属性(即没有具有非动态属性的特定C++类,即使使用预编译的QML,至少AFAIK也是如此)。 QML编译器当然可以导出已知属性的列表,然后可能有一个工具可以检查列表中的C++代码,但是AFAIK没有人编写过这样的工具。 – hyde