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

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

程序截图:

上代码:

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

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

GUI(主)线程与子线程之间的通信(用信号槽通讯)的更多相关文章

  1. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  2. .NET 事件总线,简化项目、类库、线程、服务等之间的通信,代码更少,质量更好。‎

    Jaina .NET 事件总线,简化项目.类库.线程.服务等之间的通信,代码更少,质量更好.‎ 安装 Package Manager Install-Package Jaina .NET CLI do ...

  3. IOS 线程处理 子线程

    IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585   IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...

  4. C# WebService中任务处理线程创建子线程后

    protected void WriteLog(string message) { lock (lockObject) { var file = System.IO.File.AppendText(& ...

  5. C#创建子线程,子线程使用委托更新控件

    一.背景 由于在窗体程序中通过点击一个button按键后需要更新TreeView控件的内容,由于等待时间比较长,主程序无法一起在那边等待,需要去处理其它的事情,所以就需要创建新的子线程来处理.因为主线 ...

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

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

  7. Java Thread.join()详解--父线程等待子线程结束后再结束

    目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法   join是Th ...

  8. C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)

           我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...

  9. vue---父子组件之间的通信【props,$refs、$emit】

    在用vue进行项目开发的时候,父子组件之间的通信是经常被用到的,下面就来具体说说父子组件通信的三种方式: 父组件: <template> <div> <h1>我是父 ...

随机推荐

  1. linux内核--自旋锁的理解

    http://blog.chinaunix.net/uid-20543672-id-3252604.html 自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对 ...

  2. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  3. c# 根据自定义Attribute排序

    add a class: public class ExportAttribute : Attribute {     public int FieldOrder { get; set; }      ...

  4. 隐藏Activity标题栏

    <span style="font-size:18px;"> </span> 要让Activity的标题栏不被显示的情况分两种: 一.不显示标题栏的不论什么 ...

  5. Java基础知识强化84:System类之exit()方法和currentTimeMillis()方法

    1. exit方法: public static void exit(int status): 终止当前正在运行的Java虚拟机.参数用作状态码:根据惯例,非0的状态码表示异常终止. 调用System ...

  6. Android系统更改状态栏字体颜色

    随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面.我们可以进行更多的定制化了,然而有的时候我们使用的是 ...

  7. 【转】iOS实时卡顿监控

    转自http://www.tanhao.me/code/151113.html/ 在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件 ...

  8. Highcharts 设置折线图的显示与隐藏

    1.初始化隐藏某条曲线 series 配置如: [ {name:"发帖", postCountData}, {name:"删帖帖", deleteCountDa ...

  9. 秒味课堂Angular js笔记------Angular js中的工具方法

    Angular js中的工具方法 angular.isArray angular.isDate angular.isDefined angular.isUndefined angular.isFunc ...

  10. ajax分页实现,jquery.pagination.js

    1.前台使用ajax无刷新分页,主要需要生成分页的工具条,这里使用的是jquery.pagination.js 插件参数可以参考----张龙豪-jquery.pagination.js分页 下面贴出代 ...