Qt线程间通信-信号与槽通信
生活随笔
收集整理的這篇文章主要介紹了
Qt线程间通信-信号与槽通信
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
線程間通信:
1.自定義事件:postEvent();
2.信號與槽【本質(zhì)也是通過自定義事件實現(xiàn)的】
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!
1.自定義事件:postEvent();
2.信號與槽【本質(zhì)也是通過自定義事件實現(xiàn)的】
注意:每個線程都有自己的事件循環(huán)
下面先說明下信號與槽的通信:
下面這個程序的運行截圖
模擬下載!
此程序的邏輯:
主線程有一個QProgressBar。
有一個子線程,把主線程里面的QProgressBar傳入子線程。
子線程里面在run里面有個new一個Worker類,通過信號與槽進(jìn)行通信。
這里要注意:
exec(),可以讓子線程進(jìn)入事件循環(huán)
源代碼如下:
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_Hmain.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;} }新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!
總結(jié)
以上是生活随笔為你收集整理的Qt线程间通信-信号与槽通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++|STL学习笔记-对STL中关联容
- 下一篇: Qt文档阅读笔记-Button QML