2014-09-11 13 views
6

This documentation stanynie można zadeklarować Q_ENUM z wyliczenia określonego w innej klasie

Jeśli chcesz zarejestrować enum, który jest zadeklarowany w innej klasie, wyliczenia muszą być w pełni kwalifikowane nazwy klasa definiująca to. Ponadto klasa definiująca wyliczenie musi dziedziczyć QObject, a także deklarować wyliczanie przy użyciu Q_ENUMS().

Jednak nie mogę wykonać tej pracy w poniższym przykładzie.

Klasa A:

#ifndef CLASSA_H 
#define CLASSA_H 

#include <classb.h> 

class ClassA : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(ClassB::TestEnum) 

public: 
    explicit ClassA(QObject *parent = 0) : QObject(parent) 
    { 
     const QMetaObject *metaObj = this->metaObject(); 
     qDebug() << metaObj->enumeratorCount(); 
    } 
}; 

#endif // CLASSA_H 

ClassB:

#ifndef CLASSB_H 
#define CLASSB_H 

#include <QDebug> 
#include <QMetaEnum> 
#include <QObject> 

class ClassB : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(TestEnum) 

public: 
    enum TestEnum { A, B, C }; 

    explicit ClassB(QObject *parent = 0) : QObject(parent) 
    { 
     const QMetaObject *metaObj = this->metaObject(); 
     qDebug() << metaObj->enumeratorCount(); 
    } 
}; 

#endif // CLASSB_H 

główny:

#include <classa.h> 
#include <classb.h> 

int main() 
{ 
    ClassA objectA; 
    ClassB objectB; 
} 

oczekiwany wynik:

Rzeczywista wyjściowa:

+0

Państwa dokumentacja ta po raz drugi przykład: „Gdyby typu wyliczenie zostało zadeklarowane w innej klasie, jego nazwa w pełni kwalifikowana (tj OtherClass :: Priorytet) byłaby wymagana, a ta druga klasa musiałaby również dziedziczyć QObject i rejestrować typ wyliczenia tam za pomocą makra Q_ENUMS(). ". Może błąd? Czy nie otrzymujesz ostrzeżeń lub błędów MOC? – Silicomancer

+0

to nie jest potrzebne. Po uzyskaniu metadanych dla tego wyliczenia w klasie "ClassB" te metadane mogą być używane w dowolnym miejscu, nie trzeba regenerować metadanych w innej klasie. –

Odpowiedz

5

Oto podsumowanie trochę badań:

  • Informacje podano w dokumentacji o rejestrację wyliczenia zadeklarowane w innej klasie wygląda na przestarzałe.

  • Q_ENUMS(Class::EnumName nie tworzy nowego modułu wyliczającego i jest bezużyteczny.

  • Po zadeklarowaniu nowego Q_PROPERTY w ClassA należy użyć pełnej formy enum ClassB::EnumName.

  • Jak tylko EnumName jest zarejestrowany w ClassB, nie musi być już zarejestrowany.

  • Właściwość utworzona przy użyciu modułu wyliczającego innej klasy działa poprawnie.

    class ClassA : public QObject 
    { 
    public: 
    Q_OBJECT  
    Q_PROPERTY(ClassB::TestEnum test READ test) 
    
    public: 
    explicit ClassA(QObject *parent = 0) 
    { 
        const QMetaObject *metaObj = this->metaObject(); 
        qDebug() << metaObj->enumeratorCount(); 
    
        QMetaProperty property = metaObj->property(metaObj->indexOfProperty("test")); 
        if (property.isEnumType()) 
        { 
         const QMetaEnum& enumerator = property.enumerator(); 
    
         qDebug() << enumerator.name(); 
    
         for (int i = 0 ; i < enumerator.keyCount(); i++) 
         { 
          qDebug() << QLatin1String(enumerator.key(i)) << enumerator.value(i);   
         } 
        } 
    } 
    ClassB::TestEnum test() const 
    { 
        return ClassB::A; 
    } 
    }; 
    

wyjściowa:

0 
TestEnum 
"A" 0 
"B" 1 
"C" 2 
+3

Może powinieneś zgłosić tę niespójność dokumentacji do narzędzia do śledzenia błędów Qt. – Silicomancer

+4

Gotowe. https: //bugreports.qt-project.org/browse/QTBUG-41272 – Ezee

Powiązane problemy