QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽

在主线程上,可以控制子线程启动,停止,清零

 

如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。


程序截图:



上代码:

 

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

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

posted @ 2015-11-25 07:43  findumars  Views(7605)  Comments(0Edit  收藏  举报