Q_ENUMS是"未定义"在QML?

时间:2014-01-11 19:27:14

标签: c++ qt qml qtquick2 qt-signals

Enums对我不起作用。

  • 我已使用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

所以我猜除了“你没有正确使用它”之外还有另外一个问题......它可能与我上面提到的bug有关,以及当我实例化UI元素时,我实际上实例化一个QML组件,它是一个以UI为根的对象树。虽然使用完整的QML对象处理来自C ++的指针并没有任何问题,但由于某些原因,它似乎确实会弄乱枚举。

2 个答案:

答案 0 :(得分:11)

你的问题不是枚举的曝光,而是你有一个领先的下划线。一旦删除它,它就会起作用。

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

不可否认,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();
}

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)
    }
}

main.pro

TEMPLATE = app
TARGET = main
QT += quick
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

0

答案 1 :(得分: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
而是(就像他们在这里一样)。