一、描述
QtObject 类型是一个非可视元素,仅包含 objectName 属性。
如果需要一个非常轻量级的类型来包含一组自定义属性,那么创建一个 QtObject 会很合适:
import QtQuick 2.0
Item
{
QtObject
{
id: attributes
property string name
property int size
property variant attributes
}
Text {
text: attributes.name }
}
它对于 C++ 集成也很有用,因为它继承自 QObject。
二、属性成员
objectName : string
此属性保存对象实例的 QObject::objectName。
这允许 C++ 应用程序使用 QObject::findChild() 方法在 QML 组件中定位项目。
例如,以下 C++ 应用程序定位子 Rectangle 项并动态更改其颜色值:
// MyRect.qml
import QtQuick 2.0
Item
{
width: 200; height: 200
Rectangle
{
anchors.fill: parent
color: "red"
objectName: "myRect"
}
}
// main.cpp
QQuickView view;
view.setSource(QUrl::fromLocalFile("MyRect.qml"));
view.show();
QQuickItem *item = view.rootObject()->findChild<QQuickItem*>("myRect");
if (item)
item->setProperty("color", QColor(Qt::yellow));
三、其他
私有化,,,来看以下例子
// MyRectangle .qml
import QtQuick 2.0
import QtQml 2.12
Rectangle {
id: rect
width: 100
height: 100
color: "green"
Component.onCompleted: {
console.log(attributes.usrName)
}
property string hobby: ""
property alias attr: attributes
QtObject {
id: attributes
property string usrName: "zhangSan"
}
}
// main.qml
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQml 2.12
Window {
visible: true
width: 800
height: 480
title: qsTr("Hello World")
Row {
MyRectangle {
hobby: "play games..."
Component.onCompleted: {
attr.usrName = "zhangSan"
console.log(attr.usrName)
}
}
}
}
MyRectangle组件中的 hobby属性可以直接访问赋值,例如在main.qml中 MyRectangle{ hobby: “xxx” … }。
但是如何使其不能被访问 呢???
就可以将其放置在QtObject类型中。例如,MyRectangle.qml中:
QtObject {
id: attributes
property string usrName: "zhangSan"
}
此时,在main.qml中就不能直接通过 MyRectangle { usrName: “xxx” }这种形式访问赋值了,否则报错如下:
qrc:/main.qml:17 Cannot assign to non-existent property “usrName”
// main.qml
Row {
MyRectangle {
hobby: "play games..."
usrName: "zzzz" // 错误,
Component.onCompleted: {
attr.usrName = "zhangSan"
console.log(attr.usrName)
}
}
}
起到了一种类似私有化的作用(仅限在MyRectangle.qml中访问)。
注意
:当然,以上私有化也不是绝对的。。
如果确实需要在main.qml中定义的MyRectangle类型中访问usrName属性,
可以事先在MyRectangle.qml中对QtObject类型进行别名设置,例如
property alias attr: attributes
此时,就可以main.qml中访问了,,,例如
Component.onCompleted: {
attr.usrName = "zhangSan"
console.log(attr.usrName)
}