QT信号槽跨线程传递QDataStream问题

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

第一点:

查看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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值