Q_ENUMS是“未定义的”在QML? [英] Q_ENUMS are "undefined" in QML?

查看:190
本文介绍了Q_ENUMS是“未定义的”在QML?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

枚举不为我工作。


  • 我已用 Q_ENUMS()

  • 我没有忘记使用 qmlRegisterType()注册 Q_OBJECT


  • 该模块是在QML中导入的

  • I have registered them with Q_ENUMS()
  • I did not forget the Q_OBJECT macro
  • the type is registered using qmlRegisterType()
  • the module is imported in QML

是通过书,但由于某种原因,我继续得到 undefined 为QML中的每个枚举。我缺少一些东西?

In short, everything is "by-the-book" but for some reason I continue getting undefined for each and every enum in QML. Am I missing something?

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中工作。

Also note that the registered enums are indeed available to use for the metasystem, for some reason they do not work in QML.

UPDATE:我刚找到这个错误: https://bugreports.qt-project.org / browse / QTBUG-33248
但是和那个bug不同,我的根组件是一个裸的 UI 而不是一个带有 UI的自定义元素

UPDATE: I just found this bug: https://bugreports.qt-project.org/browse/QTBUG-33248 But unlike that bug my root component is a bare UI not a custom element with UI as its root.

实际上,可以在 console.log中使用QML中的枚举值),以下代码实际上正在工作。

Turns out that it is actually possible to use enum values form QML in console.log(), the following code is actually working.

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对象的指针的任何问题,它似乎混乱枚举的某些原因。

So I guess there is another problem besides "you are not using it correctly"... It might have to do with the bug I mentioned above, and the fact that when I instantiate the UI element, I actually instantiate a QML component which is a tree of objects with the UI as the root. While this doesn't prove to be any problem for working with pointers from C++ with the full QML objects, it does seem to mess enums for some reason.

推荐答案

你的问题不是枚举的曝光,而是你有一个前导下划线的事实。一旦你删除它,它会工作。

Your problem is not the exposure of the enum, but the fact that you have a leading underscore. Once you remove that, it will work.

你需要用大写字母开始枚举值。一些规则是必要的,以区分枚举和附加的属性和枚举。前导大写将引用枚举,其余的引用属性(或未定义,如果未设置)。

You need to start the enum value with uppercase letter. Some rule is necessary to distinguish enums from attached properties from enums. Leading uppercase will refer to enums, and the rest for attached properties (or undefined if not set).

诚然,Qt本身也有一个警告,要将该枚举值赋值给int或var属性,您当前没有收到警告,并且已经与当前维护者讨论了这个问题,它似乎是稍后将被修复的错误。

Admittedly, there is also a warning in Qt itself because if you try to assign that enum value to an int or var property, you are currently not getting a warning, and having discussed that issue a little bit with the current maintainer, it seems to be a bug which will be fixed later on.

查看下面提供的解决方案的工作代码:

See the working code below with the correspondigly proposed solution:

#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



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



main.pro

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



构建并运行



Build and Run

qmake && make && ./main



输出



Output

0

这篇关于Q_ENUMS是“未定义的”在QML?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆