我在这里找到了一个非常好的解决方案,可以在 QML 中使用 C++ 类中的 ENUM:
Enums in Qt QML - qml.guide。这篇文章太好了,我觉得有义务在这里与 SO 社区分享。恕我直言,应始终进行归属,因此添加了帖子的链接。
帖子基本描述:
1) 如何在 Qt/C++ 中创建 ENUM 类型:
// statusclass.h
#include <QObject>
class StatusClass
{
Q_GADGET
public:
explicit StatusClass();
enum Value {
Null,
Ready,
Loading,
Error
};
Q_ENUM(Value)
};
2) 如何使用 QML 引擎将类注册为“不可创建类型”:
(这是使这个解决方案变得漂亮而独特的部分。)
// main.cpp
...
QQmlApplicationEngine engine;
qmlRegisterUncreatableType<StatusClass>("qml.guide", 1, 0, "StatusClass",
"Not creatable as it is an enum type.");
...
使用 qmlRegisterUncreatableType 可防止在 QML 中实例化 StatusClass。如果用户尝试实例化此类,将记录警告:
qrc:/main.qml:16 Not creatable as it is an enum type.
3) 最后,如何在 QML 文件中使用 ENUM:
// main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import qml.guide 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Component.onCompleted: {
console.log(StatusClass.Ready); // <--- Here's how to use the ENUM.
}
}
重要提示:
ENUM 应该通过使用类名引用它来使用,例如StatusClass.Ready。如果在 QML 中也使用相同的类作为上下文属性...
// main.cpp
...
QQmlApplicationEngine engine;
qmlRegisterUncreatableType<StatusClass>("qml.guide", 1, 0, "StatusClass",
"Not creatable as it is an enum type.");
StatusClass statusClassObj; // Named such (perhaps poorly) for the sake of clarity in the example.
engine.rootContext()->setContextProperty("statusClassObj", &statusClassObj); // <--- like this
...
...那么,有时人们会不小心将 ENUM 与上下文属性而不是类名一起使用。
// main.qml
...
Component.onCompleted: {
// Correct
console.log(StatusClass.Ready); // 1
// Wrong
console.log(statusClassObj.Ready); // undefined
}
...
人们倾向于犯此错误的原因是,Qt Creator 的自动完成功能将 ENUM 列为选项,无论是在使用类名引用时还是使用上下文属性。因此,在这种情况下请谨慎行事。