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

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

程序截图:

上代码:

    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. socket.setNoDelay([noDelay]) 用的是Nagle算法

    Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息:这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1984 ...

  2. 从一道面试题谈linux下fork的运行机制

    http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html

  3. C语言经典算法100例

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  4. jQuery插件之artDialog

    artDialog是一个非常强大的弹出框插件.默认有两个版本,一个是jQuery版,一个是javascript版.功能非常多,而且使用非常简单.不写了,直接贴上官网的预览运行地址,以后用得着的时候去那 ...

  5. Json之语法,格式

    JSON 文本格式在语法上与创建 JavaScript 对象的代码相同.由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 Jav ...

  6. Merge Two Sorted Lists 解答

    Question Merge two sorted linked lists and return it as a new list. The new list should be made by s ...

  7. Sonar入门(一):简介

    什么是Sonar? Sonar是一个开源的代码质量管理平台.它能对代码进行如下7个维度的管理. 使用插件,它可以对20多种语言进行代码质量管理,这其中包括Java,C#,C/C++,PL/SQL等等. ...

  8. 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器

    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...

  9. 一、crond简介

    crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,cro ...

  10. UIView 弹出动画

    // 展开动画 - (void)beginAnimations { CGContextRef context = UIGraphicsGetCurrentContext(); [UIView begi ...