1. 程式人生 > >QT GUI(主)執行緒與子執行緒之間的通訊——使用跨執行緒的訊號槽

QT GUI(主)執行緒與子執行緒之間的通訊——使用跨執行緒的訊號槽

在主執行緒上,可以控制子執行緒啟動,停止,清零

如果子執行緒啟動的話,每一秒鐘會向主執行緒傳送一個數字,讓主執行緒更新介面上的數字。

程式截圖:


上程式碼:

    1. #include <QtGui>    
    2. #include <QtCore>   
    3. #include <windows.h>  
    4. class Thread : public QThread    
    5. {    
    6.     Q_OBJECT    
    7. private:    
    8.     int number;    
    9. protected:    
    10.     void run();    
    11. public:    
    12.     Thread(QObject *parent=0);    
    13.     ~Thread();    
    14. signals:    
    15.     void UpdateSignal(int num);    
    16.     public slots:    
    17.         void ResetSlot();    
    18. };    
    19. class Widget : public QWidget    
    20. {    
    21.     Q_OBJECT    
    22. private:    
    23.     QLabel *label;    
    24.     QPushButton *startButton;    
    25.     QPushButton *stopButton;    
    26.     QPushButton *resetButton;    
    27.     Thread *myThread;    
    28.     int number;    
    29. public:    
    30.     Widget(QWidget *parent = 0);    
    31.     ~Widget();    
    32. signals:    
    33.     void ResetSignal();    
    34.     public slots:    
    35.         void ClearSlot();    
    36.         void StartSlot();    
    37.         void StopSlot();    
    38.         void UpdateSlot(int num);    
    39. };    
    40. Thread::Thread(QObject *parent)    
    41. {    
    42.     number = 0;    
    43. }    
    44. Thread::~Thread()    
    45. {    
    46. }    
    47. void Thread::run()    
    48. {    
    49.     while(1)    
    50.     {    
    51.         //開啟一個死迴圈,讓number每秒自增1,並通過傳送UpdateSignal訊號通知主介面更新  
    52.         emit UpdateSignal(number);    
    53.         number++;    
    54.         sleep(1);    
    55.     }    
    56. }    
    57. void Thread::ResetSlot()    
    58. {    
    59.     number = 0;    
    60.     emit UpdateSignal(number);    
    61. }    
    62. Widget::Widget(QWidget *parent)    
    63. {    
    64.     //設定介面佈局  
    65.     startButton = new QPushButton("start");    
    66.     stopButton = new QPushButton("stop");    
    67.     resetButton = new QPushButton("reset");    
    68.     label = new QLabel("empty");    
    69.     myThread = new Thread;    
    70.     QVBoxLayout *layout = new QVBoxLayout;    
    71.     layout->addWidget(label);    
    72.     layout->addWidget(startButton);    
    73.     layout->addWidget(stopButton);    
    74.     layout->addWidget(resetButton);    
    75.     setLayout(layout);    
    76.     //連線各自訊號糟  
    77.     connect(stopButton, SIGNAL(clicked()),     
    78.         this, SLOT(StopSlot()));    
    79.     connect(startButton, SIGNAL(clicked()),    
    80.         this, SLOT(StartSlot()));    
    81.     connect(resetButton, SIGNAL(clicked()),    
    82.         this, SLOT(ClearSlot()));    
    83.     connect(myThread, SIGNAL(UpdateSignal(int)),     
    84.         this, SLOT(UpdateSlot(int)));    
    85.     connect(this, SIGNAL(ResetSignal()),    
    86.         myThread, SLOT(ResetSlot()));    
    87.     setWindowTitle("Thread Test");    
    88.     resize(200, 200);    
    89.     myThread->start();    
    90. }    
    91. Widget::~Widget()    
    92. {    
    93. }    
    94. void Widget::StartSlot()    
    95. {    
    96.     myThread->start();    
    97. }    
    98. void Widget::StopSlot()    
    99. {    
    100.     myThread->terminate();    
    101. }    
    102. void Widget::UpdateSlot(int num)    
    103. {    
    104.     label->setText(QString::number(num));    
    105. }    
    106. void Widget::ClearSlot()    
    107. {    
    108.     emit ResetSignal();    
    109. }    
    110. #include "main.moc"  
    111. int main(int argc, char **argv)    
    112. {    
    113.     QApplication app(argc, argv);    
    114.     Widget *widget = new Widget;    
    115.     widget->show();    
    116.     return app.exec();    
    117. }   

http://blog.csdn.net/small_qch/article/details/6681907