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

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

程序截图:

上代码:

    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

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

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

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

  2. WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)

    最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...

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

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

  4. 使用electron进行原生应用的打包(2)---主进程与渲染进程之间的通信

    上一篇讲了使用electron进行打包的配置相关文件,这篇主要讲electron中很重要的通信方式. 首先解释一个概念: electron打包的应用包含两个部分 electron的环境(node),也 ...

  5. angularJs 自定义指令传值---父级与子级之间的通信

    angularJs自定义指令用法我忽略,之前有写过,这里只说一下父子级之间如何传值: 例如: 模块我定义为myApp,index.html定义 <my-html bol-val="bo ...

  6. Vue---父子组件之间的通信

    在vue组件通信中其中最常见通信方式就是父子组件之中的通信,而父子组件的设定方式在不同情况下又各有不同.最常见的就是父组件为控制组件子组件为视图组件.父组件传递数据给子组件使用,遇到业务逻辑操作时子组 ...

  7. vue $emit 父组件与子组件之间的通信(父组件向子组件传参)

    1.首先新建一个子页面为 env.vue的文件(名字这里大家可以自取) 2.然后把子页面引入父页面,代码如图: import env from '@/components/common/env' ex ...

  8. JNI加载Native Library 以及 跨线程和Qt通信

    Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...

  9. Thread线程源码解析,Java线程的状态,线程之间的通信

    线程的基本概念 什么是线程 现代操作系统在运行一个程序的时候,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.线代操作系统调度的最小单位是线程.也叫做轻量级进程.在一 ...

随机推荐

  1. Android jar包混淆

    具体可参考http://proguard.sourceforge.net/manual/examples.html#library 1.找到android的adt目录下的 D:\soft\adt-bu ...

  2. Effective Java设定游戏 - 就是爱Java

    首先,我们先设定游戏,一个网页游戏的基本场景,主角拥有各种能力,但一开始数值都只有系统初始,随着故事的发展,会接触到各种不同的场景,获得提升角色的道具与装备,来参与更高难度的任务. 阅读全文>& ...

  3. Bulk-Only传输协议 UFI命令块规范

    USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...

  4. 分布式文件系统 fastDFS 安装步骤

    安装 fastDFS 很简单. 先安装 libevent, 安装成功后,安装fastDFS. ./make.sh ./make.sh install 我使用一台tracker服务器  192.168. ...

  5. QObject就有eventFilter,功能很强(随心所欲的进行处理,比如用来QLineEdit分词)

    相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! 基于 ...

  6. bzoj2100 [Usaco2010 Dec]Apple Delivery

    Description Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, ...

  7. sh_脚本语法

    介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编写脚 ...

  8. HMM的学习笔记1:前向算法

    HMM的学习笔记 HMM是关于时序的概率模型.描写叙述由一个隐藏的马尔科夫链随机生成不可观測的状态随机序列,再由各个状态生成不可观測的状态随机序列,再由各个状态生成一个观測而产生观測的随机过程. HM ...

  9. mysq优化

    MySQL调优可以从几个方面来做:1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样可 ...

  10. Jquery Enter事件

    //IE或fireFox Event不同,所有要消除浏览器差异问题 <script type="text/javascript"> $('#<%=txtKeyWo ...