Qt线程间通信-信号与槽通信
线程间通信:
1.自定义事件:postEvent();
2.信号与槽【本质也是通过自定义事件实现的】
注意:每个线程都有自己的事件循环
下面先说明下信号与槽的通信:
下面这个程序的运行截图
模拟下载!
此程序的逻辑:
主线程有一个QProgressBar。
有一个子线程,把主线程里面的QProgressBar传入子线程。
子线程里面在run里面有个new一个Worker类,通过信号与槽进行通信。
这里要注意:
exec(),可以让子线程进入事件循环
源代码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QThread>
#include <QProgressBar>
#include <QTimer>class Worker:public QObject{Q_OBJECT
public:Worker(QObject *parent=0);~Worker();
signals:void progressChanged(int progress);protected slots:void onTimeout();public:QTimer m_timer;int m_progress;
};class DownloadThread:public QThread{
public:DownloadThread(QObject *receiver,QObject *parent=0);~DownloadThread();void run();protected:QObject *m_receiver;
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected:QProgressBar *m_progress;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include <QDebug>
#include <QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent)
{QVBoxLayout *layout=new QVBoxLayout(this);m_progress=new QProgressBar;layout->addWidget(m_progress,0,Qt::AlignCenter);DownloadThread *t=new DownloadThread(m_progress);connect(t,SIGNAL(finished()),t,SLOT(deleteLater()));t->start();
}Widget::~Widget()
{}DownloadThread::DownloadThread(QObject *receiver, QObject *parent):QThread(parent),m_receiver(receiver)
{}DownloadThread::~DownloadThread()
{}void DownloadThread::run()
{Worker *worker=new Worker;connect(worker,SIGNAL(progressChanged(int)),m_receiver,SLOT(setValue(int)));exec();
}Worker::Worker(QObject *parent):QObject(parent),m_progress(0)
{connect(&m_timer,SIGNAL(timeout()),this,SLOT(onTimeout()));m_timer.start(100);
}Worker::~Worker()
{qDebug()<<"Worker::~Worker()";
}void Worker::onTimeout()
{if(m_progress<100){m_progress++;emit progressChanged(m_progress);}else{m_timer.stop();QThread::currentThread()->quit();delete this;}
}
Qt线程间通信-信号与槽通信相关推荐
- 【QT编程】QT对象间通讯——信号与槽
01.目录 文章目录 01.目录 02.信号与槽介绍 03.信号与槽机制 04.信号(Signal) 05.槽函数(Slot) 06.一个示例 07.一个真实的示例 08.信号和槽使用默认参数 09. ...
- Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...
- Qt多线程使用 和 信号与槽传参 需要注意的问题
Qt中提供了线程类,默认窗口是主线程,这个时候如果我们的业务逻辑很费时,就会一直使用主线程,页面可能会卡顿甚至崩溃.那么将业务逻辑放入子线程,能够避免页面的卡顿,保证操作是流畅的,还能提高程序的执行效 ...
- Qt编程中的信号和槽机制
Qt编程中的信号和槽机制 在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个"点击按钮可以关闭窗口"的功能. 关闭窗口的功能可以 ...
- Qt线程间通信-自定义事件
线程间通信: 1.自定义事件:postEvent(): 2.信号与槽[本质也是通过自定义事件实现的] 注意:每个线程都有自己的事件循环 自定义事件: 1.从QEvent继承: 2.registerEv ...
- Qt图形界面编程入门(信号和槽通信机制)
信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在接 ...
- Python Qt GUI设计:信号与槽的使用方法(基础篇—7)
目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...
- Qt修炼手册4_信号与槽
1.前言 为了处理个体间的通信事件,Qt提供了信号与槽.信号与槽不仅可以处理GUI上发生的事件,也可以实现个体间的数据通信.值得深入把握. 2.信号与槽 信号与槽是一种用于对象间通信的机制.为了用户在 ...
- Qt工作笔记-使用信号与槽让两个界面进行数据通信
今天在项目中,发现有一个十分重要的功能,就是2个界面进行数据通信. 记得1年多前,刚刚学习Qt,对这个无法理解,然后经过一年多的学习和理解,在此把自己学习的感悟和知识在此总结下. 下面是使用emit ...
最新文章
- 机器学习笔记十:各种熵总结
- java zero copy 实现,关于Zero Copy
- Java-Scanner进阶使用
- 重建道路(洛谷-P1272)
- CodeForces 1506C(暴力求最长连续子串) acm寒假集训日记21/12/31or22/1/1
- php 正则xml文件,php 读取xml的方法三---用php正则表达式来记取数据
- 吴恩达深度学习2.1练习_Improving Deep Neural Networks_Regularization
- CRT工具远程登陆Google Cloud远程ssh登录方法
- IT项目范围管理案例分析——柳工错在哪里?
- 使命召唤16计算机内存不足,使命召唤16出现一个问题怎么解决
- 在ASP.NET中自动给URL加上超级链接
- Qt 判断集合中的元素是否全部相同
- 10只狗怎么鉴别1000瓶水哪瓶有毒
- visual assist x太卡了_河西区专业达格XD7500租赁 X-RAY -哪家好-老友网
- 实验一:彩色空间转换(YUV2RGB)
- 15.A Syntactic Neural Model for General-Purpose Code Generation
- 北科计算机网络真题,北京科技大学计算机组成原理和数据结构历年试题及笔记...
- 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素
- 描述性统计部分(一)----统计量
- SpringBoot整合redis使用setnx完成分布式锁