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

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

程序截图:

上代码:

    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. IClone地形编辑器结合T4M插件在Unity3D使用

    通过IClone编辑器打造的地形,经过T4M插件的转化后,资源占用极少,比在Unity中自己刷出来的地形再通过T4M转化的要小的的多多了,非常适合用在手机上. IClone地形编辑器下载地址: 如果对 ...

  2. Weblogic缓存

    缓存:如果脱离IDE工具的话,weblogic的文件会在\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user文件夹中 ...

  3. PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)

    也许你认为为什么我选择pascal代替其他的语言,像C.或者您会拿FreePascal和其他的pascal编译器作比较,那么好,这里您看看FreePascal为什么好: 1.pascal是一个非常简洁 ...

  4. 互斥体与互锁 <第五篇>

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这 ...

  5. 线程初步了解 - <第一篇>

    操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...

  6. bzoj1623 [Usaco2008 Open]Cow Cars 奶牛飞车

    Description   编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000).     ...

  7. IOS反地理编码取得城市名称

    // 获取当前所在的城市名 CLGeocoder *reverseGeocoder=[[CLGeocoder alloc] init]; [reverseGeocoder reverseGeocode ...

  8. java中return和continue区别

    编程语言大多是想通的,当然java也不例外,下面的在其他编程语言也是相同的道理. return与continue的区别 先看代码哦 class demo2 { public static void m ...

  9. Android 四大组件之 BroadcastReceiver

    0  简介        BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的 广播.        在Android系统中,广播体现在方方面面,例 ...

  10. 小谈@override

    @override是jdk1.5增加的注解,主要是用来声明子类的某方法覆盖了父类的某方法.非常简单的注解,但是有个小问题: 项目最开始使用的是jdk1.6,mvc模式:接口 ----> 实现类. ...