QML 遍历QtObject的所有属性

1.简述

QML中,所有的Qml对象都从QtObject继承,QtObject就是QObject。利用元对象可以获获取QObject的所有属性、槽函数、注册的枚举。读取的QML对象属性打印如下,获取了属性名称、类型、类型名、属性值
在这里插入图片描述

方法1 C++实现

CPropertys.cpp (QObject属性遍历的实现)

void CPropertys::printPropertys(QObject *obj)
{
    for(int i = 0; i < obj->metaObject()->propertyCount(); i++){
        QMetaProperty metaProperty = obj->metaObject()->property(i);
        qDebug()<<QString("Property name:%1 typeName:%2 typeId:%3 ")
                  .arg(metaProperty.name()).arg(metaProperty.typeName()).arg(metaProperty.typeId())
               << " value:" << metaProperty.read(obj);
    }
}

main.qml

import QtQuick

Window {
    id: root
    QtObject{
        id: qmlObj
        property color bgColor: "#ff0000"
        property color textColor: "#ff0000"
        property bool isRead: true
    }
    Component.onCompleted: {
        CppPropertys.printPropertys(qmlObj);
    }
}

终端输出

15:16:08: Starting D:\MyTemp\build-EpProperty-Desktop_Qt_6_3_0_MinGW_64_bit-Debug\debug\EpProperty.exe...
"Property name:objectName typeName:QString typeId:10 "  value: QVariant(QString, "")
"Property name:bgColor typeName:QColor typeId:4099 "  value: QVariant(QColor, QColor(ARGB 1, 1, 0, 0))
"Property name:textColor typeName:QColor typeId:4099 "  value: QVariant(QColor, QColor(ARGB 1, 1, 0, 0))
"Property name:isRead typeName:bool typeId:1 "  value: QVariant(bool, true)

3. 方法2 Js实现

借助Js中的属性遍历也同样可以达到目的,缺点是Qt封装的类不能获取到具体的类型名称,类型均显示为object,而原生的Js类型number、string、boolean可正常获取到。

Window {
    id: root

    QtObject{
        id: qmlObj
        property color bgColor: "#ff0000"
        property color textColor: Qt.rgba(0.1,0,0,1)
        property bool isRead: true
    }
	Component.onCompleted: {
        console.log("keys:",Object.keys(qmlObj));
        console.log("values:",Object.values(qmlObj));
        console.log("entries:",Object.entries(qmlObj));

        for(let i = 0; i < Object.keys(qmlObj).length; i++){
            console.log("key:", Object.keys(qmlObj)[i],
                        " type:",typeof Object.values(qmlObj)[i],
                        " val:",Object.values(qmlObj)[i])

			//判断类型是否为QColor
            var val = Object.values(qmlObj)[i].toString();
            if(val.indexOf("#") > -1){
                console.log("is QColor");
            }
        }
    }
}

终端输出

qml: keys: [objectName,bgColor,textColor,isRead,objectNameChanged,bgColorChanged,textColorChanged,isReadChanged]
qml: values: [,#ff0000,#1a0000,true,function() { [native code] },function() { [native code] },function() { [native code] },function() { [native code] }]
qml: entries: [[objectName,],[bgColor,#ff0000],[textColor,#1a0000],[isRead,true],[objectNameChanged,function() { [native code] }],[bgColorChanged,function() { [native code] }],[textColorChanged,function() { [native code] }],[isReadChanged,function() { [native code] }]]
qml: key: objectName  type: string  val: 
qml: key: bgColor  type: object  val: #ff0000
qml: is QColor
qml: key: textColor  type: object  val: #1a0000
qml: is QColor
qml: key: isRead  type: boolean  val: true
qml: key: objectNameChanged  type: function  val: function() { [native code] }
qml: key: bgColorChanged  type: function  val: function() { [native code] }
qml: key: textColorChanged  type: function  val: function() { [native code] }
qml: key: isReadChanged  type: function  val: function() { [native code] }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值