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

转载 2016年05月31日 23:51:56

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

« 上一篇:QT:“下载速度柱状图”的模拟实现——思路真好,会动脑筋,连我都有了启发(这个思路好像是通用的)
» 下一篇:windows下开发PHP扩展(无需Cygwin)

qt下利用connect跨线程发送数据

最近在做某厂家的nvr插件开发,涉及到qt下多线程的开发,具体的思路大概这样,每一个线程对应一个nvr,但是每一个线程里又存在另外一个线程(即nvr的回调函数),因为回调函数是静态函数,所以在该函数里...
  • sanmingshen
  • sanmingshen
  • 2014年01月17日 14:13
  • 1915

QT多线程中,对象信号与槽连接不上的问题

连接不上的问题有很多种,如信号与槽的参数不匹配,参数为自定义类型等等。今天碰到的一个问题是多线程中,信号与槽一直连接不上。防止忘记,记录一下。          这个问题的情景是一个QObject的...
  • xytx_823
  • xytx_823
  • 2016年07月04日 11:06
  • 2277

Qt主线程与子线程之间的信号槽通信

Qt主线程与子线程之间的信号槽通信
  • GeorgeDiDi
  • GeorgeDiDi
  • 2016年07月27日 13:49
  • 948

QT小例子GUI(主)线程与子线程之间的通信

在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。 #ifndef TQT_H_  #define...
  • imxiangzi
  • imxiangzi
  • 2015年10月20日 10:05
  • 1213

qt GUI线程和其他线程的信号槽以及不同线程通信

Qt所有的对于GUI的操作只能在一个GUI线程中执行,也就是return QApp::exec的线程。 一般main里面这样写。那么所有的GUI的操作只能在main主线程中执行。 int mai...
  • groundhappy
  • groundhappy
  • 2016年04月28日 15:44
  • 1125

QT跨线程连接信号和槽

信号与槽的使用、参数传递等问题。
  • rabbitjerry
  • rabbitjerry
  • 2017年05月03日 20:30
  • 1252

Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总

Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总
  • qq2399431200
  • qq2399431200
  • 2016年08月27日 15:58
  • 1405

pyqt4 利用信号槽在子线程里面操作Qt界面

#-*- coding:utf-8 -*- ####### from PyQt4.QtCore import * from PyQt4.QtGui import * import sys import...
  • caobin0825
  • caobin0825
  • 2016年05月04日 18:22
  • 546

Qt跨线程信号和槽的连接

文章来源:http://blog.csdn.net/seanyxie/article/details/7025183 Qt支持三种类型的信号-槽连接: 1,直接连接,当signal发射时,slot...
  • libaineu2004
  • libaineu2004
  • 2014年03月01日 10:03
  • 3710

Qt5线程之间通信的小例子

mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include namespace Ui { class Main...
  • u012997311
  • u012997311
  • 2016年07月08日 14:39
  • 1202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
举报原因:
原因补充:

(最多只允许输入30个字)