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_OBJECT

public:
    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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81052270