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

  • 相关阅读:
    [GO] go使用etcd和watch方法进行实时的配置变更
    [GO]go context的deadline方法
    [GO]go使用contextCancel
    [GO]go使用etcd
    js控制复选框checkbox 只能单选
    JQuery.Ajax之错误调试帮助信息
    SQLServer2005创建定时作业任务
    JS/JQuery针对不同类型元素的操作(radio、select、checkbox)
    SQL Server跨库查询
    javax.net.ssl.SSLHandshakeException(Cas导入证书)
  • 原文地址:https://www.cnblogs.com/findumars/p/4993546.html
Copyright © 2011-2022 走看看