簡體   English   中英

Q_ENUMS在QML中是“未定義的”?

[英]Q_ENUMS are “undefined” in QML?

枚舉對我不起作用。

  • 我用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但是與那個錯誤不同,我的root組件是一個裸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為根的對象樹。 雖然使用完整的QML對象處理來自C ++的指針並不存在任何問題,但由於某種原因,它確實似乎弄亂了枚舉。

你的問題不是枚舉的曝光,而是你有一個領先的下划線。 一旦你刪除它,它將工作。

您需要使用大寫字母啟動枚舉值。 需要一些規則來區分枚舉與附加屬性和枚舉。 前導大寫將引用枚舉,其余為引用屬性(如果未設置則為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

我有完全相同的問題,並且由於這些解決方案,我想出了我的問題。 但是,如果其他人正在處理相同的混音,這里更清楚一點。

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

相反(就像他們在這里一樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM