41.QT-多線程與界面之間交互總結

1. 線程與界面組件須要注意的地方多線程

  • 在QThread線程中不能直接建立QWidget之類的界面組件.
  • 由於在QT中,全部界面組件相關的操做都必須在主線程中(也就是GUI thread)
  • 因此, QThread線程不能直接操做界面組件.

2.QThread線程如何操做界面組件-方法1app

  • 將多線程類對象封裝爲GUI界面類的類成員
  • 而後在子線程定義信號函數,經過信號槽機制,向界面組件emit發射信號,從而實現間接操做.

 

3.QThread線程如何操做界面組件-方法2函數

  • 使用QApplication::postEvent()實現向界面發送事件,從而可以封裝一個自定義類

 

4.使用Invokes()函數來調用界面組件的信號槽-方法3post

通常使用該函數(用來調用對方的私有信號或槽):this

該函數的鏈接方式默認使用的是Qt::AutoConnectionspa

  • 表示若是接收者和發送者在同一個線程,則自動使用Qt::DirectConnection類型。若是接收者和發送者不在一個線程,則自動使用Qt::QueuedConnection類型。

 

好比,當咱們想調用一個obj下的compute(QString, int, double)槽函數時:線程

則只須要寫入:code

QMetaObject::invokeMethod(obj, "compute", Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7));

示例以下所示:對象

在Testtherd線程類裏經過invokeMethod向父界面類的paintMsg槽函數發送信息blog

void Testtherd::run() {
int count=0; while(1) { QString str="請稍等,正在驗證用戶,登陸中"; for(int i =0;i<count;i++) str.append('.'); //循環添加小數點 count=(count+1)%7; QMetaObject::invokeMethod(this->parent(), "paintMsg", Q_ARG(QString, str)); msleep(500); } }

父界面類的paintMsg槽函數以下所示:

void loginwindow:: paintMsg(QString msg) { this->LineHint->setText(msg); }

運行效果以下:

 

相關文章
相關標籤/搜索