枚举对我来说行不通。
注意,已注册的枚举值确实可以用于元系统,但由于某种原因,它们在QML中无法使用。
更新:我刚刚发现了这个错误:https://bugreports.qt.io/browse/QTBUG-33248 但与那个错误不同的是,我的根组件是一个裸的
事实证明,在
- 我已经使用
Q_ENUMS()
进行了注册 - 我没有忘记
Q_OBJECT
宏定义 - 类型是使用
qmlRegisterType()
进行注册的 - 模块已在QML中导入
undefined
。 我错过了什么吗?class UI : public QQuickItem {
Q_OBJECT
Q_ENUMS(ObjectType)
public:
enum ObjectType {
_Root = 0,
_Block
};
...
};
...
qmlRegisterType<UI>("Nodes", 1, 0, "UI");
...
import Nodes 1.0
...
console.log(UI._Root) // undefined
注意,已注册的枚举值确实可以用于元系统,但由于某种原因,它们在QML中无法使用。
更新:我刚刚发现了这个错误:https://bugreports.qt.io/browse/QTBUG-33248 但与那个错误不同的是,我的根组件是一个裸的
UI
,而不是一个以UI
为根的自定义元素。事实证明,在
console.log()
中使用QML中的枚举值是可行的,以下代码实际上可以工作。class A : public QObject {
Q_OBJECT
Q_ENUMS(EA)
public:
enum EA {
EA_NULL = 0,
EA_ONE
};
};
class B : public A {
Q_OBJECT
Q_ENUMS(EB)
public:
enum EB {
EA_TWO = 2,
EA_THREE
};
};
#include "main.moc"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<A>("test", 1, 0, "A");
qmlRegisterType<B>("test", 1, 0, "B");
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/enums/main.qml"));
viewer.showExpanded();
return app.exec();
}
并且...
Component.onCompleted: {
console.log(A.EA_NULL)
console.log(A.EA_ONE)
console.log(B.EA_NULL)
console.log(B.EA_ONE)
console.log(B.EA_TWO)
console.log(B.EA_THREE)
}
输出结果为:
0
1
0
1
2
3
所以,除了“你没有正确使用它”之外,我猜还有其他问题……这可能与我上面提到的错误有关,以及当我实例化UI
元素时,实际上是实例化了一个QML组件,该组件是一个对象树,以UI
作为根。虽然这在使用来自C++的指针与完整的QML对象时不会产生任何问题,但出现了某些原因导致枚举混乱。