qt - QML:反射访问属性类型
问题描述
在 QML 中,如何通过反射查询项目属性的类型?
即我有一个C
具有x
typereal
属性y
和 type属性的 Item string
;在其他一些呼叫站点,我有一个实例C
并且想要查询其属性的类型x
。使用普通的 Qt,我可以使用QMetaObject
,但是如何使用 QML 做同样的事情?
解决方案
与 JavaScript 一样,您可以使用typeof
:
QtObject {
id: c
property real x
property string y
property int z
Component.onCompleted: print(typeof c.x, typeof c.y, typeof c.z)
}
这将打印qml: number string number
.
x
请注意,即使它们不是同一类型,这里也没有区别z
,这是因为 JavaScript 只知道一种数字类型,每个数字都是 64 位浮点*。
如果您想知道 Qt 引擎实际上是如何存储类型的,则必须按照您在问题中提到的那样做,使用 QMetaObject。为此,您可以将 c++ 类型公开为qml 单例,并在其中公开一个可调用的方法,返回对象属性的类型名:
#ifndef METAOBJECTHELPER_H
#define METAOBJECTHELPER_H
#include <QMetaObject>
#include <QObject>
#include <QQmlProperty>
class MetaObjectHelper : public QObject {
Q_OBJECT
public:
using QObject::QObject;
Q_INVOKABLE QString typeName(QObject* object, const QString& property) const
{
QQmlProperty qmlProperty(object, property);
QMetaProperty metaProperty = qmlProperty.property();
return metaProperty.typeName();
}
};
#endif // METAOBJECTHELPER_H
在 QML 中执行此操作:
print(MetaObjectHelper.typeName(c, "x"), MetaObjectHelper.typeName(c, "y"), MetaObjectHelper.typeName(c, "z"));
然后将打印qml: double QString int
* : 更多细节在这里
推荐阅读
- java - 在 Android Studio 中插入时,值将存储在 .db-shm 和 .db-wal 中,而不是实际的 SQLite 文件中
- ios - iOS/Swift - 导致网络请求冲突的生命周期方法
- ansible - 组中主机的排序
- .net - 使用 Windows 身份验证的 Web api 中的 Cors 问题
- json - 尝试使用 d3.js 并从 Chrome 中的 Web 服务器加载 .json 地图文件,没有错误但未加载数据
- vim - 如何在字符串之间搜索模式并快速修复?
- powerbi - Power BI DAX 动态日历
- sql - 将 2 个不同表中的列与 SQL Server 中 table_2 中仅最后插入的值进行比较
- vuex - Vuex:如果状态中没有数据,则 getter 调度动作
- django - 在 django 中使用令牌身份验证,但我需要获取用户会话长度?