gpt4 book ai didi

c++ - Q_ENUMS 在 QML 中是 "undefined"吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:53 25 4
gpt4 key购买 nike

枚举不适合我。

  • 我已经用 Q_ENUMS() 注册了它们
  • 我没有忘记 Q_OBJECT
  • 使用 qmlRegisterType() 注册类型
  • 模块是用QML导入的

简而言之,一切都是“照章办事”,但出于某种原因,我继续为 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 对象来说没有任何问题,但由于某种原因它似乎确实会弄乱枚举。

最佳答案

你的问题不是枚举的暴露,而是你有一个前导下划线的事实。删除它后,它将起作用。

您需要以大写字母开头的枚举值。需要一些规则来区分枚举和附加属性。前导大写字母表示枚举,其余表示附加属性(如果未设置则为未定义)。

诚然,Qt 本身也有一个警告,因为如果您尝试将该枚举值分配给一个 int 或 var 属性,您目前不会收到警告,并且已经与当前的维护者讨论了这个问题,这似乎是一个错误,稍后会修复。

请参阅下面的工作代码以及相应的建议解决方案:

main.cpp

#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();
}

主.qml

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

关于c++ - Q_ENUMS 在 QML 中是 "undefined"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com