2017-03-21 27 views
0

是否可以使用编译时安全从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,如果它们无法转换类型或者属性不存在,但我正在寻找编译时错误检查。

有没有人有任何想法如何做到这一点?

+0

你需要一个额外的工具,AFAIK一个不存在。它不能成为“普通”构建的一部分,因为QML文件可以在运行时从磁盘加载,在这种情况下,没有什么能够防止它们在编译后被更改。但当然有* *可能是一个工具,它检查C++代码对当前的QML文件,并抱怨这样的东西... – hyde

+0

@hyde QML文件不需要必须是JIT,因为我们正在使用Qt Quick Compiler我认为它可以设计成在链接器阶段检测到它。感谢评论。 –

+0

我认为QML组件实例只使用动态属性(即没有具有非动态属性的特定C++类,即使使用预编译的QML,至少AFAIK也是如此)。 QML编译器当然可以导出已知属性的列表,然后可能有一个工具可以检查列表中的C++代码,但是AFAIK没有人编写过这样的工具。 – hyde

回答

2

这完全依赖于C++类的object

如果你访问它的声明(头),你可以投的具体类型和呼叫setter方法,而不是直接通过抽象属性API会。

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

更好的方法是将数据作为暴露给QML的对象的属性提供,并处理QML端的分配。 在C++控制下,暴露对象的API是完整的,因此您可以始终使用各自的类型检查调用setter。

0

这是不可能的,因为Qt元对象系统依赖于QVariant,所以传递给它的所有数据都将首先转换为QVariant,然后才转换回接收端。而对话是否失败只会在运行时间内被发现。

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