2016-06-07 2 views
3

Zum Beispiel habe ich die folgende Klasse:Gibt es eine Möglichkeit, QMetaEnum mit Q_ENUMS zu verwenden, die nicht zur Klasse Q_OBJECT oder Q_GADGET gehören?

namespace someName 
{ 
    class someClass 
    { 
     Q_ENUMS(ESomeEnum) 

     public: 
     enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C}; 

     // ... some other things .. 
    } 
} 

Q_DECLARE_METATYPE(someName::someClass) 

Gibt es eine Möglichkeit QMetaEnum :: valueToKey oder QMetaEnum :: keyToValue zu benutzen?

Versucht das Verfahren in this answer bekam aber den folgenden Fehler:

error: static assertion failed: QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG 
#define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message) 

Ich kann X-Makros verwenden meine gewünschte Ausgabe zu erhalten, aber es wäre auch schön sein, mehr Tricks in Qt zu lernen.

+0

Sie verwenden 'Q_ENUMS ', Ich denke du musst' Q_ENUM' in diesem Fall benutzen. – thuga

+0

Ich behalte Code, der auf diese Weise geschrieben wird, und die Änderung von Q_ENUMS zu Q_ENUM würde unnötige "Panik" für den Projektmanager anzeigen, da dies viele Dateien betrifft. – misilita

Antwort

3

Nein, gibt es nicht, weil Q_ENUM ‚s-Funktionalität in Code von moc erzeugte implementiert wird, und moc ignoriert Klassen, die weder Q_OBJECT sind noch Q_GADGET. Es gibt keinen Grund, kein Q_GADGET zu verwenden, da es keine Auswirkung auf die Objektgröße hat: es werden keine virtuellen Methoden oder Datenfelder hinzugefügt.

Im Folgenden zeigt dies:

#include <QtCore> 

namespace Ns { 
class Class { 
    Q_GADGET 
public: 
    enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C}; 
    Q_ENUM(ESomeEnum) 
}; 
} 

int main() { 
    auto metaEnum = QMetaEnum::fromType<Ns::Class::ESomeEnum>(); 
    qDebug() << sizeof(Ns::Class) << metaEnum.valueToKey(Ns::Class::ENUM_A); 
} 
#include "main.moc" 

Ausgang:

1 ENUM_A 

Auf dieser speziellen Plattform (und viele andere), leere Klassen sind der Größe 1.

5

Q_ENUM ist wie die alte Q_ENUMS aber mit diesen Unterschieden:

  • Es muss nach der enum im Quellcode platziert werden.
  • Nur eine enum kann in das Makro eingefügt werden.
  • Es ermöglicht QMetaEnum::fromType<T>().
  • Diese enum s werden automatisch als QMetaType s deklariert (nicht mehr hinzufügen sie in Q_DECLARE_METATYPE mehr).
  • enum s an qDebug übergeben wird der Name des Werts anstelle die Nummer gedruckt.
  • Bei Eingabe in QVariant gibt toString() den Wertnamen an. Der Wert Name wird von QCOMPARE gedruckt (seit Qt 5,6)

von WOBOQ blog post on the topic genommen, es für weitere Informationen lesen Sie in Bezug auf Q_ENUM vs Q_ENUMS.

Verwandte Themen