QML 中的 objectName: 属性是什么,为什么需要它,它与 id: 属性有何不同?

Ano*_*non 4 programming application-development qml ubuntu-sdk

  1. QML 中的 objectName: 属性是什么?
  2. 哪些组件具有此属性?
  3. 为什么需要它?
  4. 它与 id: 属性有何不同?
  5. 为什么我不能只使用 id: 属性?

Syl*_*eau 7

此属性保存对象的名称。objectName 是 QObject 的 QString 属性,默认为空 QString。

当您需要从 Qt 中查找 QML 元素时,您通常会设置此属性。通过这种方式,可以从 Qt (C++) 代码访问 QML 元素的信号、属性和函数。

Autopilot 测试使用此属性来检查您的应用程序。

与 C++ 中的 QML 对象交互

QML 组件本质上是对象树,其子节点有兄弟节点和它们自己的子节点。QML 组件的子对象可以使用QObject::objectName属性和QObject::findChild() 来定位。例如,如果 MyItem.qml 中的根项有一个子 Rectangle 项:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle {
        anchors.fill: parent
        objectName: "rect"
    }
}
Run Code Online (Sandbox Code Playgroud)

孩子可以这样定位:

QObject *rect = object->findChild<QObject*>("rect");
if (rect)
    rect->setProperty("color", "red");
Run Code Online (Sandbox Code Playgroud)

请注意,一个对象可能有多个具有相同 objectName 的子对象。例如,ListView 创建其委托的多个实例,因此如果使用特定的 objectName 声明其委托,则 ListView 将有多个具有相同 objectName 的子项。在这种情况下,QObject::findChildren()可用于查找具有匹配 objectName 的所有子项。

警告:虽然可以使用 C++ 访问和操作深入对象树的 QML 对象,但我们建议您不要在应用程序测试和原型设计之外采用这种方法。QML 和 C++ 集成的一个优势是能够独立于 C++ 逻辑和数据集后端实现 QML 用户界面,如果 C++ 端深入 QML 组件以直接操作它们,这种策略就会失效。例如,如果新组件缺少所需的 objectName,这将很难将 QML 视图组件交换为另一个视图。C++ 实现最好尽可能少地了解 QML 用户界面实现和 QML 对象树的组成。

如果需要objectName进行测试,这绝对值得。objectName 显然不应在不需要时添加。添加它们时,应遵循一般的 QML 性能指南

来源:将 objectNames 添加到 QML 项目对内存有什么影响?