qRegisterMetaType 注册自定义类型
最后更新于:2022-04-02 02:14:26
[TOC]
## qRegisterMetaType
在定义信号槽的时候,传递的参数类型如果是自定义类型(自定义class类,或者num类等),
并且涉及跨线程时,最好先通过qRegisterMetaType()将自定义类型进行注册,否则会报错:
```
QObject::connect: Cannot queue arguments of type 'XXXXXXX'
(Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().)
```
### 如果传递的参数类型是指针类型
不需要进行注册,因为指针实际传递的是指针地址,QT无需去从新construct构造对象,但是需要注意的是,指针指向的地址不能发送完立马释放.
## 实例
```
#include
// 自定MyDataType 类型,在这个类型的顶部包含:#include
#include
#include
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");告诉QT,Text类型的别名为"Text",当然也可以改为其他别名
// 如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType("MyDataType&");
qRegisterMetaType("Text");
MyThread t;
QObject::connect(&t,SIGNAL(send(Text)),&w,SLOT(recv(Text)));
t.start();
w.show();
return a.exec();
}
```
';