die folgende Klassendefinition vor:Q_ENUMS und mit Erklärungen funktionieren nicht zusammen
// exported.hpp
#include <QObject>
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
enum class FOO { BAR };
Q_ENUM(FOO)
};
Und die folgende main
Datei:
// main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include "exported.hpp"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<Exported>("Package", 1, 0, "Exported");
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
Auf diese Weise ich leicht die genannten Konstanten meines zugreifen können Aufzählung in QML.
Als Beispiel:
// main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import Package 1.0
ApplicationWindow {
Rectangle {
Component.onCompleted: {
console.log(Exported.BAR)
}
}
}
Dies solange die Erklärung des ENUM arbeitet in der Klasse eingeschlossen.
Als Beispiel, wenn ich die Klassendefinition ändern, wie unten dargestellt, es funktioniert nicht mehr:
// exported.hpp
#include <QObject>
enum class FOO { BAR };
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
using FOO = ::FOO;
Q_ENUM(FOO)
};
Nun Exported.BAR
in der QML-Datei undefined
ist.
Die grundlegendste Frage ist: Warum es nicht mit mit Erklärungen funktioniert?
Beachten Sie, dass es mit weitergeleitet Erklärungen als Beispiel funktioniert:
// exported.hpp
#include <QObject>
enum class FOO { BAR };
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
enum class FOO;
Q_ENUM(FOO)
enum class FOO { BAR };
};
Dies ist auf die documentation von Q_ENUM
tatsächlich (Hervorhebung von mir) wahr:
Dieses Makro einen Aufzählungstyp mit dem Meta-Register -Objektsystem. Sie muss nach der Enum-Deklaration in einer Klasse platziert werden, die über das Makro Q_OBJECT oder Q_GADGET verfügt.
Keine Erwähnung einer Definition im gesamten Abschnitt.
Auf der anderen Seite, haben wir diese von der Norm:
A unter Verwendung Deklaration einen Satz von Deklarationen in den deklarativen Bereich einführt, in dem die Verwendung Deklaration angezeigt.
Also, ich habe erwartet, dass es auch funktioniert. Wie auch immer, das war vielleicht eine falsche Erwartung auf meiner Seite.
Das sagte, jeder Vorschlag, wie man mit einem solchen unbequem umgehen?
Die einzige Möglichkeit, um es zu umgehen, falls die enum außerhalb der Klasse definiert ist, ist ein anderes enum innerhalb der Klasse definieren und eine Eins-zu-Eins-Zuordnung zwischen ihnen haben.
Es ist weit davon entfernt, wartbar und ein bisschen langweilig in der Tat.
Nun, das eigentliche Problem ist, dass das Enum aus einer Bibliothek kommt, also kann ich das nicht tun. Trotzdem danke. Der Verweis auf den Standard sollte sich auch auf die Tatsache beziehen, dass wahrscheinlich _declaration_ in der Qt-Dokumentation fehlt. Das ist alles. – skypjack
@skypjack Okay, es ist möglich, dass Qt's Dokumente verbessert werden können. Ich werde diese Antwort für die Nachwelt hinterlassen, auch wenn sie Ihr Problem nicht löst. – krzaq
Absolut, es ist im allgemeinen Fall in Ordnung, wenn Sie sowohl die Klasse als auch die Enum kontrollieren. – skypjack