第一点:
查看QDataStream类,可以发现这一句
Q_DISABLE_COPY(QDataStream)
Q_DISABLE_COPY是QT的一个宏,顾名思义,意思为禁用拷贝构造函数,如果要知道这个宏的实现,可以继续F2。
所以第一个结论,要使用信号槽传递QDataStream数据,只能传递引用或指针,这里以传递引用为例。
第二点:
要实现跨线程传递数据,如果采用自动连接的信号槽,即不显示给定connect的第五个参数。
connect(classa,&ClassA::sendData,classb,&ClassB::receiveData);
这种写法由QT自动判别第五个参数的值:
1.信号发送者所依附的线程和信号接收者所依附的线程相同的时候,那么第五个参数的值为:Qt::DirectConnection
2.信号发送者所依附的线程和信号接收者所依附的线程不同的时候,那么第五个参数的值为:Qt::QueuedConnection
接着看QT Assistant对第五个参数连接类型的说明:
This enum describes the types of connection that can be used between signals and slots. In

本文探讨了QDataStream在QT信号槽机制中跨线程传递时遇到的问题,由于Q_DISABLE_COPY宏禁用了拷贝构造函数,因此必须通过引用或指针传递。在跨线程场景下,若使用默认的Qt::QueuedConnection会导致错误,解决方案是设定连接类型为Qt::DirectConnection,但这样会使槽函数与信号源线程同步,从而限制了在槽中操作GUI元素的能力。
最低0.47元/天 解锁文章
705

被折叠的 条评论
为什么被折叠?



