5 c++ qt qml qt-signals qtquick2
枚举对我不起作用.
Q_ENUMS()Q_OBJECT宏qmlRegisterType()简而言之,一切都是"按书",但由于某种原因,我继续获得undefinedQML中的每一个枚举.我错过了什么吗?
class UI : public QQuickItem {
Q_OBJECT
Q_ENUMS(ObjectType)
public:
enum ObjectType {
_Root = 0,
_Block
};
...
};
Run Code Online (Sandbox Code Playgroud)
...
qmlRegisterType<UI>("Nodes", 1, 0, "UI");
Run Code Online (Sandbox Code Playgroud)
...
import Nodes 1.0
...
console.log(UI._Root) // undefined
Run Code Online (Sandbox Code Playgroud)
编辑:另请注意,注册的枚举确实可用于元系统,由于某些原因它们不能用于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<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();
}
Run Code Online (Sandbox Code Playgroud)
和...
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)
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
1
0
1
2
3
Run Code Online (Sandbox Code Playgroud)
所以我猜除了"你没有正确使用它"之外还有另外一个问题......它可能与我上面提到的错误有关,而且当我实例化该UI元素时,我实际上实例化了一个QML组件,这是一个UI以root 为对象的树.虽然使用完整的QML对象处理来自C++的指针并没有任何问题,但由于某种原因,它确实似乎弄乱了枚举.
lpa*_*app 11
你的问题不是枚举的曝光,而是你有一个领先的下划线.一旦你删除它,它将工作.
您需要使用大写字母启动枚举值.需要一些规则来区分枚举与附加属性和枚举.前导大写将引用枚举,其余为引用属性(如果未设置则为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();
}
Run Code Online (Sandbox Code Playgroud)
import Nodes 1.0
import QtQuick 2.0
Rectangle {
id: button
width: 500; height: 500
MouseArea {
anchors.fill: parent
onClicked: console.log(UI.Root)
}
}
Run Code Online (Sandbox Code Playgroud)
TEMPLATE = app
TARGET = main
QT += quick
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)
qmake && make && ./main
Run Code Online (Sandbox Code Playgroud)
0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7202 次 |
| 最近记录: |