Q_ENUMS在QML中是"未定义的"?

 氤氲微凉521 发布于 2023-02-04 13:52

枚举对我不起作用.

我已经注册了 Q_ENUMS()

我没有忘记Q_OBJECT

该类型是使用注册的 qmlRegisterType()

该模块以QML导入

简而言之,一切都是"按书",但由于某种原因,我继续获得undefinedQML中的每一个枚举.我错过了什么吗?

class UI : public QQuickItem {
    Q_OBJECT
    Q_ENUMS(ObjectType)
public:
enum ObjectType {
        _Root = 0,
        _Block
    };
...
};

...

qmlRegisterType("Nodes", 1, 0, "UI");

...

import Nodes 1.0
...
console.log(UI._Root) // undefined

编辑:另请注意,注册的枚举确实可用于元系统,由于某些原因它们不能用于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("test", 1, 0, "A");
    qmlRegisterType("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以root 为对象的树.虽然使用完整的QML对象处理来自C++的指针并没有任何问题,但由于某种原因,它确实似乎弄乱了枚举.

1 个回答
  • 你的问题不是枚举的曝光,而是你有一个领先的下划线.一旦你删除它,它将工作.

    您需要使用大写字母启动枚举值.需要一些规则来区分枚举与附加属性和枚举.前导大写将引用枚举,其余为引用属性(如果未设置则为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
    

    2023-02-04 13:56 回答
撰写答案
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有