zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry] 类似问题
    哪些window你不知道的却实用的小技巧----window小技巧
    windows命令快捷启动应用-----window小技巧
    cmd窗口关闭 -----window小技巧!
    Eclipse错误笔记!
    如何在WIndows电脑上安装 SVN Server 实现代码版本控制
    linux之应用开发杂记(一)
    面试知识点汇总
    Android技术面试整理
    MYSQL常用操作语句
  • 原文地址:https://www.cnblogs.com/findumars/p/4851479.html
Copyright © 2011-2022 走看看