自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

QT中實(shí)現(xiàn)Thread與GUI主線程連通方法

移動(dòng)開(kāi)發(fā)
本文以QString為例,注冊(cè)時(shí)首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType<QString>("QString");加上這兩句就注冊(cè)成功了。先來(lái)看內(nèi)容。

本文介紹的是QT中實(shí)現(xiàn)Thread與GUI主線程通,目前只會(huì)一種,采用信號(hào)槽機(jī)制。

通常情況下,信號(hào)機(jī)制可以同步操作,這就意味著在發(fā)射信號(hào)的時(shí)候,使用直接函數(shù)即可以立刻調(diào)用連接到一個(gè)信號(hào)上的多個(gè)。然而,當(dāng)連接位于不同線程中的對(duì)象時(shí),這一機(jī)制就會(huì)變得不同步起來(lái),可以通過(guò)修改QObject::connect()的第5個(gè)可選參數(shù)而改變。

connect的第五個(gè)參數(shù)Qt::QueuedConnection表示函數(shù)由接受信號(hào)的線程所執(zhí)行,如果不加表示函數(shù)由發(fā)出信號(hào)的次線程執(zhí)行。當(dāng)傳遞信號(hào)的參數(shù)類型不是QT的元類型時(shí)要先注冊(cè),關(guān)于QT的元類型可以參看QT文檔

QMetaType這個(gè)類里面列舉了所有的元類型。

以QString為例,注冊(cè)時(shí)首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType<QString>("QString");加上這兩句就注冊(cè)成功了。

貼個(gè)示例的代碼,次線程不斷更改一個(gè)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);  

小結(jié):QT中實(shí)現(xiàn)Thread與GUI主線程連通方法的內(nèi)容介紹完了,在壇子里逛了一圈,解決線程的問(wèn)題還真不少,***還是希望本文對(duì)你有幫助。

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-07-14 15:34:22

Swing中的線程GUI程序

2011-06-14 09:46:11

Qt QThread 線程

2012-05-14 17:09:05

iOS

2011-06-20 13:43:08

Qt Socket 線程

2011-06-30 17:51:17

QT 元類型 線程

2017-03-23 18:02:59

Android線程Tread

2011-06-14 14:57:06

QT Python GUI

2010-03-01 13:28:44

Python子線程

2011-06-13 10:03:19

Qt 多線程 編程

2011-06-22 16:02:37

Qt 多線程 重入

2009-06-29 17:54:10

Java多線程Thread類創(chuàng)建線程

2011-06-13 10:21:25

QT 信號(hào) 槽機(jī)制

2011-06-30 15:25:05

QT QPF TTF

2017-03-13 10:41:33

iOSUI操作主線程

2011-06-30 17:31:32

Qt 多線程 信號(hào)

2011-07-01 14:34:02

Thread Affinity 信號(hào)

2011-06-13 09:04:39

QT Flash 交互

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-24 11:12:39

Qt 多線程 線程

2011-06-22 14:38:09

QT 多線程 線程安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)