QT中實現Thread與GUI主線程連通方法

本文介紹的是QT中實現Thread與GUI主線程通,目前只會一種,採用信號槽機制。

通常情況下,信號機制可以同步操作,這就意味着在發射信號的時候,使用直接函數即可以立刻調用連接到一個信號上的多個。然而,當連接位於不同線程中的對象時,這一機制就會變得不同步起來,可以通過修改QObject::connect()的第5個可選參數而改變。

connect的第五個參數Qt::QueuedConnection表示函數由接受信號的線程所執行,如果不加表示函數由發出信號的次線程執行。當傳遞信號的參數類型不是QT的元類型時要先註冊,關於QT的元類型可以參看QT文檔

QMetaType這個類裏面列舉了所有的元類型。

以QString爲例,註冊時首先Q_DECLARE_METATYPE(QString);然後,int id=qRegisterMetaType<QString>("QString");加上這兩句就註冊成功了。

貼個示例的代碼,次線程不斷更改一個QString傳給GUI主線程,主線程在GUI界面上顯示。

  1. mythread.h  
  2. #ifndef MYTHREAD_H  
  3. #define MYTHREAD_H  
  4. #include <QThread> 
  5. class MyThread : public QThread  
  6. {  
  7. Q_OBJECT  
  8. public:  
  9. MyThread();  
  10. ~MyThread();  
  11. protected:  
  12. void run();  
  13. signals:  
  14. void changeText(QString str);  
  15. };  
  16. #endif // MYTHREAD_H  
  17. widgett.h  
  18. #ifndef WIDGETT_H  
  19. #define WIDGETT_H  
  20. #include <QtGui/QMainWindow> 
  21. #include "ui_widgett.h"  
  22. class WidgetT : public QMainWindow  
  23. {  
  24. Q_OBJECT  
  25. public:  
  26. WidgetT(QWidget *parent = 0, Qt::WFlags flags = 0);  
  27. ~WidgetT();  
  28. private:  
  29. Ui::WidgetTClass ui;  
  30. private slots:  
  31. void labelSetText(QString qstr);  
  32. };  
  33. #endif // WIDGETT_H  
  34. mythread.cpp  
  35. #include "mythread.h"  
  36. MyThread::MyThread()  
  37. : QThread()  
  38. {  
  39. }  
  40. MyThread::~MyThread()  
  41. {  
  42. }  
  43. void MyThread::run(){  
  44. static int i=0;  
  45. while(true)  
  46. {  
  47. ++i;  
  48. QString strnum = QString::number(i);  
  49. emit changeText(strnum);  
  50.  
  51. QThread::sleep(1);  
  52. }  
  53. }  
  54. widgett.cpp  
  55. #include "widgett.h"  
  56. #include "mythread.h"  
  57. Q_DECLARE_METATYPE(QString);  
  58. WidgetT::WidgetT(QWidget *parent, Qt::WFlags flags)  
  59. : QMainWindow(parent, flags)  
  60. {  
  61. ui.setupUi(this);  
  62. MyThread *mythread = new MyThread;  
  63. int id=qRegisterMetaType<QString>("");  
  64. connect(mythread,SIGNAL(changeText(QString)),this,SLOT(labelSetText(QString)),Qt::QueuedConnection);  
  65. mythread->start();  
  66. }  
  67. WidgetT::~WidgetT()  
  68. {  
  69. }  
  70. void WidgetT::labelSetText(QString qstr){  
  71. ui.label->setText(qstr);  

小結:QT中實現Thread與GUI主線程連通方法的內容介紹完了,在罈子裏逛了一圈,解決線程的問題還真不少,最後還是希望本文對你有幫助。

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章