[英]Q_ENUMS are “undefined” in QML?
枚舉對我不起作用。
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但是與那個錯誤不同,我的root組件是一個裸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
為根的對象樹。 雖然使用完整的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
我有完全相同的問題,並且由於這些解決方案,我想出了我的問題。 但是,如果其他人正在處理相同的混音,這里更清楚一點。
我在QML中使用C ++中的類就像這里一樣,所以我在main.cpp
有這樣的東西
qmlRegisterType<EnumClass>("Enums", 1, 0, "EnumClass");
在.qml
import Enums 1.0
EnumClass {
id: ec
}
嘗試並試圖訪問ec.SomeEnum
但仍然undefined
即使QtCreator
自動完成說ec.SomeEnum
應該存在。
這根本不起作用,為了讓這個工作,我不得不使用
EnumClass.SomeEnum
相反(就像他們在這里一樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.