5

枚举不适合我。

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

简而言之,一切都是“按部就班”,但出于某种原因,我继续undefined为 QML 中的每个枚举获取信息。我错过了什么吗?

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

事实证明,实际上可以在 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();
}

和...

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 对象并没有任何问题,但由于某种原因它似乎确实弄乱了枚举。

4

2 回答 2

13

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

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

诚然,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();
}

main.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
于 2014-01-11T20:06:14.607 回答
2

我遇到了完全相同的问题,感谢这些解决方案,我发现了我的问题。但是,如果其他人正在处理相同的混淆,这里会更清楚一些。

我在 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

相反(就像他们在这里做的那样)。

于 2017-03-10T15:20:42.660 回答