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

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

程序截图:

上代码:

  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. supervisor:进程管理工具

    一,安装(任何一种方式) apt-get install supervisor easy_install supervisor pip install supervisor 二,配置 配置superv ...

  2. Mvc中DropDownList 和DropDownListFor的常用方法

    Mvc中DropDownList 和DropDownListFor的常用方法 一.非强类型: Controller:ViewData["AreId"] = from a in rp ...

  3. Java程序员可能犯的3个常见SQL错误

    概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL.那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧! 你可能看到Ja ...

  4. Robotium -- AndroidUI优化工具HierarchyViewer

    为什么使用HierarchyViewer 不合理的布局会使我们的应用程序UI性能变慢,HierarchyViewer能够可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助我们优化布局设计.H ...

  5. cocos2d-3.0 Helloworld::onTouchMoved的处理机制的推測

    bool sign2 = true; bool sign2 = true; void GameLayer::onTouchMoved(Touch *touch, Event *unused){ if( ...

  6. 搭建HWI(HiveWebInterface)步骤总结

    众所周知,Hive有三种使用方式:CLI.HWI浏览器.Thrift客户端.安装配置完Hive后无需进行额外操作即可使用CLI.但是HWI则需要单独搭建.本文主要记录我自己搭建HWI的过程. 说明:本 ...

  7. (转)使用DataTime这个类来获取当前的时间

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(--).时间(::).日期+时间(-- ::)等. //获取日期+时间 DateTime ...

  8. ASP.NET 中的返回按钮的实现【转】

      返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都 ...

  9. NYOJ737

    题意:给n堆石子,按照顺序排列,只能相邻两堆石子合并,求最后合并为一堆时所花费的最小代价,石子合并代价为两堆石子之和. 输入: n(石子堆数) Xi(每堆石子个数) 输出: T(最小代价) 思路:经典 ...

  10. mysql索引和缓存

    mysql有缓存,缓存的设置见[转]MySql查询缓存机制