【问题标题】:Changing QML properties with compile-time safety from C++从 C++ 更改具有编译时安全性的 QML 属性
【发布时间】: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 还没有人编写过这样的工具。

标签: c++ qt qml


【解决方案1】:

这完全取决于 object 的 C++ 类型

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

但是,无论如何,从 C++ 设置 QML 对象属性通常都不是一个好主意,因为您依赖于对象的存在和特定类型。

更好的方法是将数据作为对象的属性提供给 QML,并在 QML 端处理分配。 暴露对象的 API 然后完全在 C++ 控制下,因此允许您始终调用设置器并进行相应的类型检查。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2019-11-06
      • 2021-06-25
      相关资源
      最近更新 更多