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

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

程序截图:

上代码:

    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. Linux下find与grep指令的相关用法

    find命令 find命令的一般形式 find命令的常用选项及实例 find与xargs grep命令 grep命令的一般形式 grep正则表达式元字符集(基本集) grep命令的常用选项及实例 1. ...

  2. logstash grok 解析Nginx

    log_format main '$remote_addr [$time_local] "$request" ' '$request_body $status $body_byte ...

  3. 【POJ 3279 Fliptile】开关问题,模拟

    题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...

  4. 转化率最高的16个WordPress 电子商务主题

    想自己开一个WordPress的电子商务商店?下面我们分享转化率最高的16个WordPress 电子商务主题,它们拥有最棒的用户体验,集成最新的用户体验,慢慢欣赏吧! 原文地址:http://thet ...

  5. MySql 取一天的开始时间和结束时间

    -- 取一开的开始时间 SELECT str_to_date(DATE_FORMAT(NOW(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'); -- 取第二天的开始时间 sele ...

  6. XMind快捷键可以自定义吗

    在使用快捷键的时候,不知你是否有过这样的疑问,为什么这个操作的快捷键一定要是这个呢,我为什么不能换成其他的按键呢.其实这些在XMind思维导图中都是可以更改的,用户可以根据自己的操作习惯来定义快捷键命 ...

  7. Android学习总结——SQLite

    SQLiteDatabase类: 一.使用sql语句操作数据库 SQLiteDatabase db = openOrCreateDatabase("database.db", MO ...

  8. tomcat建立虚拟主机

    WEB浏览器与WEBserver建立连接后,除了将请求URL中的资源路径发送给WEBserver外,还会将URL中的主机名部分作为HTTP请求消息的Host头发送给WEBserver.比如,在浏览器地 ...

  9. Hide a file in a picture

    有时候.假设你想在电脑上隐藏关键的文件而不想让其它人看见.你会怎么做呢?找一个专业的工具?为目录设置password?更改文件属性?这些方法可行.但它们可能不太方便和安全.这里,我给大家共享一个在图片 ...

  10. 事关Animation Tree的工作随笔(一)

    最近的业务上,又回到Animation Tree这块了. 众所周知的是Animation Tree这些概念已经提出很久了,但是使用有着AT支持的CE引擎的项目,却依然义无反顾地没有使用AT,而且,连某 ...