intmain(intargc,char*argv[]){QApplicationapp(argc, argv);qRegisterMetaType<MyStruct>("MyStruct");// ...returnapp.exec(); } 这使得 MyStruct 可以在跨线程的信号和槽调用中安全使用。如果只是想在同一线程内的信号和槽或者使用 QVariant 存储自定义类型的话,通常只需要 Q_DECLARE_METATYPE 宏。 此外,...
Q_DECLARE_METATYPE(struct1)//struct1与struct2 谁先谁后,没有影响 Q_DECLARE_METATYPE(struct2) intmain(intargc,char*argv[]) { QApplication a(argc, argv); struct1 v1 = {1, 2.0}; QVariant var1; var1.setValue(v1); if(var1.canConvert<struct1>())//判断能否转化为相应类型 { struct...
Q_DECLARE_METATYPE(struct1)//struct1与struct2 谁先谁后,没有影响 Q_DECLARE_METATYPE(struct2) intmain(intargc,char*argv[]) { QApplication a(argc, argv); struct1 v1 = {1, 2.0}; QVariant var1; var1.setValue(v1); if(var1.canConvert<struct1>())//判断能否转化为相应类型 { struct...
int qRegisterMetaType() Call this function to register the type T. T must be declared with Q_DECLARE_METATYPE(). Returns the meta type Id.Example:int id = qRegisterMetaType<MyStruct>();This function requires that T is a fully defined type at the point where the function is called. For p...
有命名空间, Q_DECLARE_METATYPE() 宏应该放在命名空间外面 namespace MyNamespace { ... } Q_DECLARE_METATYPE(MyNamespace::MyStruct) 1. 2. 3. 4. 5. 6. Since MyStruct is now known to QMetaType, it can be used in QVariant:
代码来源:src/corelib/kernel/qmetatype.h #define Q_DECLARE_METATYPE(TYPE) \ 1. QT_BEGIN_NAMESPACE \ 1. template <> \ 1. struct QMetaTypeId< TYPE > \ 1. { \ 1. enum { Defined = 1 }; \ 1. static int qt_metatype_id() \ ...
Q_DECLARE_METATYPE(QMap<QString, bool>); 你就会发现编译不过,并且抓狂了。 解决方法嘛,当然很简单:参照Q_DECLARE_METATYPE的宏定义,自己把它展开,编译器就不会再犯傻了。 [cpp]view plaincopy QT_BEGIN_NAMESPACE template <> struct QMetaTypeId< QMap<QString, bool> > ...
Q_DECLARE_METATYPE(QMap<QString,bool>); 你就会发现编译不过,并且抓狂了。 解决方法嘛,当然很简单:参照Q_DECLARE_METATYPE的宏定义,自己把它展开,编译器就不会再犯傻了。 [cpp]view plaincopy QT_BEGIN_NAMESPACE template<> structQMetaTypeId< QMap<QString,bool> > ...
宏Q_DECLARE_METATYPE定义了偏特化的QMetaTypeId,QMetaTypeId会调用qRegisterMetaType进行注册,但并没有立刻调用它,当第一次调用的时候,才会调用qRegisterMetaType注册。在没注册之前,这些class的实例还不能放入消息系统进行传递。所以,最好在入口函数里用qRegisterMetaType对消息中要使用的class类型进行事先的注册,才能避免...
}Q_DECLARE_METATYPE(MyNamespace::MyStruct) Q_DECLARE_METATYPE在compile time注册类型,使类型T可以用于所有的模板类,包括QVariant。 如果要在QueuedConnections的信号槽连接中使用类型T,还需要使用qRegisterMetaType()来注册,因为QueuedConnections信号槽参数是动态查找的。