- QML 中的 objectName: 属性是什么?
- 哪些组件具有此属性?
- 为什么需要它?
- 它与 id: 属性有何不同?
- 为什么我不能只使用 id: 属性呢?
答案1
此属性保存对象的名称。objectName 是 QObject 的一个 QString 属性,默认为空 QString。
当您需要从 Qt 中查找 QML 元素时,通常会设置此属性。这样,就可以从 Qt(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 指南应遵循。
答案2
1:用于按名称查找对象
2:全部,它来自QObject
3:自动驾驶仪使用它从测试用例中检查你的应用程序
4:我不太确定
5:我认为外部工具(如自动驾驶仪)无法发现该 ID