在最近的项目开发中,遇到一个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,就能正常触发信号了。这点一定要注意,网上也很少有人说到这一点。
很多人说他们使用的时候,一会能触发,一会不能触发,估计很可能跟这个有关。