QT中多线程信号槽的一个注意事项

在最近的项目开发中,遇到一个QT多线程在信号槽机制上的使用细节,写出来分享一下:

我的应用场景很简单,就是:在一个非QT线程中,需要进行刷新界面的操作,比如在某一个消息窗口(QTextEdit)中打印一条消息。

这个简单的问题,需要注意以下细节:

1 在界面主程序connect信号时,connetionType参数一定要使用QueuedConnection,这样就能异步的处理该信号。像这样:

   connect(this, SIGNAL(OutputLog(QString)), this, SLOT(OutputSlot(QString)), Qt::QueuedConnection);

  在发射信号时,使用emit语句。

  emit(this, OutputLog(QString::fromLocal8Bit("test log"))); 

 注意:在普通非QT线程中,也可以使用Qt:BlockingQueuedConnection这种connetionType,网上很多文章说普通线程只能使用QueuedConnection,应该是不对的。

只是Qt:BlockingQueuedConnection只能同步处理信号,如果界面操作很多的话,性能会比较差。

2 在信号和槽函数的定义中,最好使用QT原生的数据类型,如:

public :

signals:

    void OutputLog(QString strContent);

private: slots:

OutputSlot(QString strContent);

这里之前使用std::string作为参数类型,就触发不了信号,后来改成QString,就能正常触发信号了。这点一定要注意,网上也很少有人说到这一点。

很多人说他们使用的时候,一会能触发,一会不能触发,估计很可能跟这个有关。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值