Qt信号和槽在线程之间传递

Qt中的信号和槽的机制是Qt中最常用的也是最具优势的一个特点,但是使用起来有时候会遇到一些问题,最近一直在用Qt做项目,其中使用到了通过信号在线程之间传递数据,发现了一些问题,最后通过各种搜集资料及自己的测试,最后总结了一下。

在run函数中发射信号,在主线程处理,线程的start函数一定要放在connect函数之后,connect第五个参数不用写,内部机制会自己判断是同线程还是不同线程,默认参数即可,信号中带有参数的时候要注意是否是可以排队(不同线程之间信号传递是通过队列的)的(即是否是基本的数据类型),如果使用了非基本数据类型,槽函数是不能相应的,这时候需要在connect所在的构造函数里自己通过函数进行定义(在connect之前),比如我在传参的时候用到了uint16_t这个参数,需要以下函数转换

qRegisterMetaType<uint16t>("uint16_t"); 

参数不能排队Qt会有错误提示,但不是报错;

以下是我的构造函数,可以参考

GprsDataproc::GprsDataproc(QObject *parent) : QObject(parent)
{
    connect(&m_UdpGprs, SIGNAL(ptCIR_Frame(uint8_t*,uint16_t)), this, SLOT(GMGprsData_Proc(uint8_t*,uint16_t)));
 
    qRegisterMetaType<uint16_t>("uint16_t");
 
    connect(&m_GMGprs, SIGNAL(ptCIR_Frame2(uint8_t*, uint16_t)), this, SLOT(GMGprsData_Proc(uint8_t *, uint16_t)));
 
   m_GMGprs.start();
}
 

猜你喜欢

转载自blog.csdn.net/Lzh020120/article/details/84581330