枚举对我不起作用.
我已经注册了 Q_ENUMS()
我没有忘记Q_OBJECT
宏
该类型是使用注册的 qmlRegisterType()
该模块以QML导入
简而言之,一切都是"按书",但由于某种原因,我继续获得undefined
QML中的每一个枚举.我错过了什么吗?
class UI : public QQuickItem { Q_OBJECT Q_ENUMS(ObjectType) public: enum ObjectType { _Root = 0, _Block }; ... };
...
qmlRegisterType("Nodes", 1, 0, "UI");
...
import Nodes 1.0 ... console.log(UI._Root) // undefined
编辑:另请注意,注册的枚举确实可用于元系统,由于某些原因它们不能用于QML.
更新:我刚刚发现了这个错误:https://bugreports.qt.io/browse/QTBUG-33248
但是与那个错误不同,我的root组件是一个UI
不是自定义元素UI
的根目录.
事实证明,实际上可以使用QML形式的枚举值console.log()
,以下代码实际上正在工作.
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("test", 1, 0, "A"); qmlRegisterType("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
以root 为对象的树.虽然使用完整的QML对象处理来自C++的指针并没有任何问题,但由于某种原因,它确实似乎弄乱了枚举.
你的问题不是枚举的曝光,而是你有一个领先的下划线.一旦你删除它,它将工作.
您需要使用大写字母启动枚举值.需要一些规则来区分枚举与附加属性和枚举.前导大写将引用枚举,其余为引用属性(如果未设置则为undefined).
不可否认,Qt本身也有一个警告,因为如果你试图将这个枚举值分配给int或var属性,你当前没有得到警告,并且已经与当前的维护者讨论了这个问题,它似乎是一个将在以后修复的错误.
请参阅下面的工作代码以及相应的建议解决方案:
#include <QQuickView> #include <QQuickItem> #include <QGuiApplication> #include <QUrl> class UI : public QQuickItem { Q_OBJECT Q_ENUMS(ObjectType) public: enum ObjectType { Root = 0, _Block }; }; #include "main.moc" int main(int argc, char **argv) { QGuiApplication guiApplication(argc, argv); qmlRegisterType<UI>("Nodes", 1, 0, "UI"); QQuickView *view = new QQuickView; view->setSource(QUrl::fromLocalFile("main.qml")); view->show(); return guiApplication.exec(); }
import Nodes 1.0 import QtQuick 2.0 Rectangle { id: button width: 500; height: 500 MouseArea { anchors.fill: parent onClicked: console.log(UI.Root) } }
TEMPLATE = app TARGET = main QT += quick SOURCES += main.cpp
qmake && make && ./main
0