在写功能时,一次 从子线程 串口读取数据 发回给主线程。使用信号槽,QByteArray作为参数,在linux开发板系统下 一运行 没有任何提示,也没数据。
而测试一下使用QString作参数确可以触发槽函数,想不明白为什么,也没查到原因。
不得已,只好把相关代码移植 到windows下模拟一下慢慢调式。
if(m_pSerialTTyWK2==NULL && m_pThreadTTyWK2 ==NULL) { m_pSerialTTyWK2 = new SerialPortProc(this); m_pThreadTTyWK2 = new QThread(this); qDebug()<<" ----- >>> New m_pSerialTTyWK2 Thread"; m_pSerialTTyWK2->moveToThread(m_pThreadTTyWK2); connect(this,SIGNAL(SendOpenSerialTTyWK2Signal(QString,QString)),m_pSerialTTyWK2,SLOT(OnDataReceivedOpenSerialPort(QString,QString))); connect(m_pSerialTTyWK2,SIGNAL(SendComDataArrivedSignal(QByteArray&)),this,SLOT(OnRecvdTTyWK2Data(QByteArray&))); //connect(this,SIGNAL(SendDataToSerialPortProcSignal(QByteArray&)),m_pSerialTTyWK2,SLOT(OnDataReceivedWriteToSerialPort(QByteArray&))); //connect(this,SIGNAL(SendDataToSerialPortProcSignal(char*,int)),m_pSerialTTyWK2,SLOT(OnDataReceivedWriteToSerialPort(char*,int))); connect(m_pSerialTTyWK2,SIGNAL(SendTestSignal(QByteArray)),this,SLOT(OnDataRecvdTestSlot(QByteArray))); m_pThreadTTyWK2->start(); emit SendOpenSerialTTyWK2Signal("COM3","9600"); }
如上:connect(m_pSerialTTyWK2,SIGNAL(SendComDataArrivedSignal(QByteArray&)),this,SLOT(OnRecvdTTyWK2Data(QByteArray&))); 是从子线程 发串口数据到主线程,主线程的槽确收不到。会有个提示:QObject::connect: Cannot queue arguments of type 'QByteArray&' (Make sure 'QByteArray&' is registered using qRegisterMetaType().),然而在开发板里运行 确没有提示。
qRegisterMetaType<QByteArray>("QByteArray&"); 注册一下 是可以了。
但是 为什么需要注册?
如果 非跨线程,传递QByteArray好像是可以不用注册。
莫名其妙的要求,哎。
标签:SLOT,sure,QByteArray,pSerialTTyWK2,SIGNAL,qRegisterMetaType,connect,QString From: https://www.cnblogs.com/totogo/p/17414009.html