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)
}

相关推荐

  1. qmlQtObject类型使用

    2024-01-25 23:38:02       54 阅读
  2. qml入门系列教程】:qml QtObject用法介绍

    2024-01-25 23:38:02       50 阅读
  3. qml刷新C++QImage图像

    2024-01-25 23:38:02       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 23:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 23:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 23:38:02       82 阅读
  4. Python语言-面向对象

    2024-01-25 23:38:02       91 阅读

热门阅读

  1. 关于C#中的Select与SelectMany方法

    2024-01-25 23:38:02       61 阅读
  2. C# DLL嵌套调用时修改生效

    2024-01-25 23:38:02       53 阅读
  3. 地址解析协议

    2024-01-25 23:38:02       63 阅读
  4. MongoDB聚合:$currentOp

    2024-01-25 23:38:02       54 阅读
  5. C语言|判断和循环相关题目

    2024-01-25 23:38:02       60 阅读
  6. 一次Rust重写基础软件的实践(二)

    2024-01-25 23:38:02       46 阅读
  7. named_struct

    2024-01-25 23:38:02       62 阅读
  8. 五、C#与数据库交互(数据存储过程与触发器)

    2024-01-25 23:38:02       60 阅读
  9. android gradle 使用总结

    2024-01-25 23:38:02       60 阅读