🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## qRegisterMetaType 在定义信号槽的时候,传递的参数类型如果是自定义类型(自定义class类,或者num类等), 并且涉及跨线程时,最好先通过qRegisterMetaType()将自定义类型进行注册,否则会报错: ``` QObject::connect: Cannot queue arguments of type 'XXXXXXX' (Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().) ``` ### 如果传递的参数类型是指针类型 不需要进行注册,因为指针实际传递的是指针地址,QT无需去从新construct构造对象,但是需要注意的是,指针指向的地址不能发送完立马释放. ## 实例 ``` #include <QString> // 自定MyDataType 类型,在这个类型的顶部包含:#include <QMetaType> #include <QMetaType> #include <QDebug> class Text { public: Text() { qDebug()<<"Text"; } Text(const Text& t) { this->m_str = t.m_str; } QString m_str; }; //在类型定义完成后,加入声明 Q_DECLARE_METATYPE(Text); ``` ``` int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; // 在connect连接信号槽之前调用RegisterMetaType<Text>("Text");告诉QT,Text类型的别名为"Text",当然也可以改为其他别名 // 如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType<MyDataType>("MyDataType&"); qRegisterMetaType<Text>("Text"); MyThread t; QObject::connect(&t,SIGNAL(send(Text)),&w,SLOT(recv(Text))); t.start(); w.show(); return a.exec(); } ```