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