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

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

答案1

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

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

自动驾驶测试使用此属性来检查您的应用程序。

通过 C++ 与 QML 对象交互

QML 组件本质上是对象树,其子对象有兄弟对象,子对象也有自己的子对象。可以使用QObject::对象名称财产QObject::findChild()。例如,如果 MyItem.qml 中的根项有一个子矩形项:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle {
        anchors.fill: parent
        objectName: "rect"
    }
}

孩子的位置可以像这样:

QObject *rect = object->findChild<QObject*>("rect");
if (rect)
    rect->setProperty("color", "red");

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

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

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

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

答案2

1:用于按名称查找对象

2:全部,它来自QObject

3:自动驾驶仪使用它从测试用例中检查你的应用程序

4:我不太确定

5:我认为外部工具(如自动驾驶仪)无法发现该 ID

相关内容