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

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

程序截图:

上代码:

    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. Unity3D自定义地形的笔刷,刷出别样地形

    ​ 是不是很简单呀,大家可以发挥想象刷出特殊的地形,小鸡呀,或者其他的logo之类(顶视图看上去效果很棒)的地形. 最后把我找的笔刷上传,Gizmos 注意: 如果文件夹及图片导入后,地形系统的笔刷无 ...

  2. USB系列之六:基于DOSUSB的简单U盘驱动程序

    首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...

  3. python刷取CSDN博文访问量之一

    python刷取CSDN博文访问量之一 作者:vpoet 注:这个系列我只贴代码,代码不注释.有兴趣的自己读读就懂了,纯属娱乐,望管理员抬手 若有转载一定不要注明来源   #coding=utf-8 ...

  4. Python IDE的选择和安装

    安装好Python后我们需要选择合适自己的IDE进行学习,虽然利用python默认的编辑器,或者直接文档编辑也可以进行基础的学习,但总归不是太方便,能够开发python项目的IDE很多,如sublim ...

  5. 【枚举+数学】【HDU1271】整数对 难度:五颗星

    整数对 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  6. LAMP的安装

    一,LAMP的安装流程:mysql.apache.php或者apache.mysql.php.php放到最后的原因是,php在编译安装的时候是依赖于前2者的. 二,Mysql的安装: 1.下载mysq ...

  7. android 多语言适配

    建好android项目后,默认的是有个values文件,该文件下面默认的有strings.xml. 做多语言适配的时候,就需要在创建好的项目中,右键单击res文件夹,选择创建新的xml文件. 然后点击 ...

  8. Git使用过程

    Git-------目前世界上最先进的分布式版本控制系统(没有之一) 什么是版本控制系统? 说简单点,就是一个文件,对其增加.删除.修改都可以被记录下来,不仅自己可以修改,其他人也可以进行修改 每次对 ...

  9. android一些常用的代码2(收藏)

    1.收集设备信息,用于信息统计分析 public static Properties collectDeviceInfo(Context context) { Properties mDeviceCr ...

  10. hdu2304Electrical Outlets

    Problem Description Roy has just moved into a new apartment. Well, actually the apartment itself is ...