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:
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
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. –