在创建 QApplication 之前使用 Qt 元类型系统是否可以?
Is it ok to use Qt metatype system before QApplication is created?
每当我需要在 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;
//.....
通过这种方式,我什至在 main() 函数启动之前就以所有可能的方式注册了 MyType。所以,问题是
1) 整个Qt MetaObject 系统是否需要一个QCoreApplication 实例?也许我的代码是巧合?
2) 有什么好的解决方案不涉及我丑陋的拐杖(即 Clerk class)吗?
QCoreApplication
负责为 Qt 应用程序提供事件循环,处理应用程序的初始化和结束以及管理应用程序和系统设置。
在创建像 QWidget
这样的项目时,您绝对应该有一个 QApplication
的实例。但是在创建 QCoreApplication
或 QApplication
.
的实例之前使用 QMetaType
class 或使用 qRegisterMetaType
不会有任何问题
每当我需要在 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;
//.....
通过这种方式,我什至在 main() 函数启动之前就以所有可能的方式注册了 MyType。所以,问题是
1) 整个Qt MetaObject 系统是否需要一个QCoreApplication 实例?也许我的代码是巧合?
2) 有什么好的解决方案不涉及我丑陋的拐杖(即 Clerk class)吗?
QCoreApplication
负责为 Qt 应用程序提供事件循环,处理应用程序的初始化和结束以及管理应用程序和系统设置。
在创建像 QWidget
这样的项目时,您绝对应该有一个 QApplication
的实例。但是在创建 QCoreApplication
或 QApplication
.
QMetaType
class 或使用 qRegisterMetaType
不会有任何问题