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函数应该在哪里连接信号和槽呢?应该怎么用呢?为什么会出现槽不响应信号的问题呢?...

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

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

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

在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。 程序截图: 上代码: #in...

ArrayList 和数组之间的一些转换 Handler的主线程与子线程通信 内部类的使用

1. ArrayList和数组之间的一些转换 ArrayLlist底层就是用数组实现的,并且提供了两个方法给我们来将集合转换成数组 1. public Object[] toArr...

Android使用Handler实现子线程与子线程、主线程之间通信

今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间、子线程与主线程之间如何进行通信,关于具体的内部实现因为我也没研究过,所以这篇文章讲不了。一、子线程向主线程传值:这个实现比较简单,因为...

Android 多线程之间的通信交互(Ui线程与子线程之间的通信)Handler,Handler.post(Runnable runnable),runUiThread方式

工作内容: 1.FrameLayout/OnTouchListener(滑动监听) 2.生命周期 3.UI线程 4.Android中的耗时操作/多线程 5.多线程中的交互 学习分享: 1.Fram...

Android学习笔记--Handler主线程与子线程之间的通信

Android中规定不能在主线程以外访问UI,同时又建议不要在UI中进行耗时操作。而Android提供了Handler这个工具来处理这种消息传递。 首先我们要明白主线程和子线程的概念: 主线程:实现业...

handler 主线程与子线程之间的通信

在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了。那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务。...

QT主线程与子线程通信处理QWT绘制曲线(动态,可重复绘制多张)

CSyncSplinePlot.h #include "qtheader_file.h" //用来重绘X轴坐标 class TimeScaleDraw: public QwtScaleDra...

qt 与ros 实现UI界面下主线程与子线程双向通信

子线程给主线程通信:首先子线程给主线程通信的方法: http://blog.csdn.net/jmy5945hh/article/details/34796359这个网上资料特别多,看这个链接你基...
  • wamdafm
  • wamdafm
  • 2016年04月21日 16:52
  • 380
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
举报原因:
原因补充:

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