qml中QtObject类型的用法小结
作者:@十三阿哥
一、描述
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) }
到此这篇关于qml中QtObject类型的使用的文章就介绍到这了,更多相关qml QtObject类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!