2016-11-09 6 views
2

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.

Antwort

1

Dies hat nichts mit Standard C++ zu tun, zumindest nicht direkt. Qt's moc ist in seinem Verständnis der C++ - Syntax Regeln ziemlich begrenzt (und mit gutem Grund). Anscheinend ist diese Art, Enums in Klassenbereiche zu importieren, außerhalb ihrer Fähigkeiten.

In meinem Code, wenn ich moc Enum generieren möchte < -> Zeichenfolge-Konvertierungen für mich, mich mit dem Alias ​​gehen, aber in der entgegengesetzten Richtung:

class Exported: public QObject { 
    Q_OBJECT 

public: 
    using QObject::QObject; 

    enum class FOO { BAR }; 

    Q_ENUM(FOO) 
}; 

using FOO = Exported::Foo; 

Das hält moc glücklich und gelten C++ . Der Nachteil ist, dass Sie die Definition von Exported in jeden Bereich ziehen, den Sie FOO 's Definition in verwenden, und Sie können FOO nicht weiterleiten.

es erstellt wurde, bevor libclang eine Sache und die Implementierungskosten eines vollständigen C++ Parser für ein paar Sonderfälle war wäre extrem unwirtschaftlich.

+1

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

+0

@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

+0

Absolut, es ist im allgemeinen Fall in Ordnung, wenn Sie sowohl die Klasse als auch die Enum kontrollieren. – skypjack

Verwandte Themen