Я использую следующий код всякий раз, когда мне нужно зарегистрировать тип в системе метаобъектов Qt:
* .h файл
class MyClass
{
//.....
class MyType {.....};
static const int metaType_MyType;
class MetaClerk
{
public:
MetaClerk(void);
};
static const MetaClerk metaClerk;
//.....
};
Q_DECLARE_METATYPE(MyClass::MyType)
QDataStream &operator<<(QDataStream &stream, const MyClass::MyType &a);
QDataStream &operator>>(QDataStream &stream, MyClass::MyType &a);
* .cpp файл
//.....
const int MyClass::metaType_MyType = qRegisterMetaType<MyClass::MyType>("MyClass::MyType");
MyClass::MetaClerk::MetaClerk()
{
qRegisterMetaTypeStreamOperators<MyClass::MyType>("MyClass::MyType");
}
const MyClass::MetaClerk MyClass::metaClerk;
//.....
Таким образом, я зарегистрировал MyType всеми возможными способами, прежде чем функция main () даже запустится. Итак, вопрос
1) Нужен ли всей системе Qt MetaObject экземпляр QCoreApplication? Может быть, мой код работает по счастливой случайности?
2) Есть ли хорошее решение, НЕ включающее мой уродливый костыль (а именно класс Клерка)?
QCoreApplication
отвечает за обеспечение цикла событий для приложений Qt, обработку инициализации и финализации приложения и управление настройками приложения и системы.
При создании таких предметов, как QWidget
у вас обязательно должен быть экземпляр QApplication
, Но не будет проблем с использованием QMetaType
класс или использование qRegisterMetaType
перед созданием экземпляра QCoreApplication
или же QApplication
,