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

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

程序截图:

上代码:

  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. 利用"NOTIFYICONDATA"实现MFC的托盘程序

    本文章为转发百度空间内容,,保存一下,以防以后用到.. 一.自定义信息 在头文件中加入下面这句话: #define WM_SHOWTASK (WM_USER+1) 二.MYDLG.CPP文件中添加_m ...

  2. 写自己的WPF样式 - 窗体

    初试WPF样式,感觉还不错.上篇写完了按钮的样式下面写窗体,废话不多说直接上代码: (1)定义一个窗体样式"MyWpfWindow" <Style x:Key="M ...

  3. SKView类

    继承自 UIView:UIResponder:NSObject 符合 NSCoding(UIView)UIAppearance(UIView)UIAppearanceContainer(UIView) ...

  4. linux命令详解--tcpdump

    工作中一直在用tcpdump,感觉非常方便,今天心血来潮百度了一下tcpdump的用法,才发现原来还有这么多强大的功能自己都不知道,那叫一个汗啊. 以此文作为备份,记录一些新知道的用法,各位网友谁有新 ...

  5. [Angular + Webpack] ocLazyLoad compoment

    $stateProvider .state('landing', { url: '/', views: { 'body@': { template: '<olr-landing></ ...

  6. linux下mysql5.5的安装

    #rpm –qa|grep –i mysql查看已安装的mysql版本 如果有已存在的mysql版本则删除 安装服务端和客户端,去Oracle官网下载: # rpm -ivh MySQL-serve ...

  7. Linux Mysql如何移动MySQL数据库目录位置

      假如要把目录移到/home/data下需要进行下面几步: 1.home目录下建立data目录 cd /home mkdir data 2.把MySQL服务进程停掉: mysqladmin -u r ...

  8. Injecting and Binding Objects to Spring MVC Controllers--转

    I have written two previous posts on how to inject custom, non Spring specific objects into the requ ...

  9. java/php/c#版rsa签名以及java验签实现--转

    在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本.譬如java.php.c#.另外,在电子商务尤其是支付领 ...

  10. javascript基础之for循环

    1.数组定义声名 var arry = [1,2,3,4,5]   //相当与var arry = Array(1,2,3,4,5) 2.数据的增删改查 var arry = [1,2,3,4,5] ...