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

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

程序截图:

上代码:

  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. 如何用命令将本地项目上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  2. Andrdoid中相应用程序的行为拦截实现方式之----从Java层进行拦截

    致谢: 感谢 简行之旅的这篇blog:http://blog.csdn.net/l173864930/article/details/38455951,这篇文章是參考这篇blog的进行一步一步操作的, ...

  3. uva 317 - Hexagon(规律推导)

    题目连接:317 - Hexagon 题目大意:在一个19个六边形组成的图形上玩一个游戏,给出9个数字, 分成3组, 分别可以填在左上角, 上, 有上角,因为对于小六边形来说, 对边的数是相同的, 然 ...

  4. 【iOS解决思路】得到某个view所在的ViewController

    在一个tableViewCell中有个btn,如何得到它所在的viewcontroller,以便于push出新的viewController? 我的思路是传值,但网上有下面这种方法,分享. 跟得到某个 ...

  5. Linux用户磁盘配额

    一:内核中支持QUOTA: [root@localhost /]# grep  CONFIG_QUOTA /boot/config-3.10.0-123.el7.x86_64 CONFIG_QUOTA ...

  6. EventBus 事件总线 案例

    简介 地址:https://github.com/greenrobot/EventBus EventBus是一个[发布 / 订阅]的事件总线.简单点说,就是两人[约定]好怎么通信,一人发布消息,另外一 ...

  7. IO-文件 File 复制 读写 总结

    一定要注意: 传入的参数,应该是包含文件名的完整路径名,不能把一个文件复制到[文件夹]中,因为[文件夹]本身是不能有输入输出流的,只能复制到一个[文件]中,否则会报异常. 以字节流读写的三种方式 pu ...

  8. 富文本 SpannableString Span

    经典使用场景 SpannableStringBuilder needStartSSB = new SpannableStringBuilder("需要"); SpannableSt ...

  9. https加密

    对称加密  客户端和服务器使用同一把钥匙,加密算法公开 非对称加密  不同钥匙,公钥加密的私钥可以打开 私钥加密的公钥可以打开 HTTPS关键: 1. 要传输的业务数据,使用对称加密. 客户端生成私钥 ...

  10. Java直接插入算法

    直接插入算法是将N个带排序的元素看做成一个有序表和一个无序表. 每次从无序表中取一个元素和有序表比较,重复N-1次完成排序. 直接上代码: package test; public class Tes ...