QT子线程画图

1.业务类

MyWork.h

#ifndef MYWORK_H
#define MYWORK_H

#include <QObject>
#include <QImage>

class MyWork : public QObject
{
    Q_OBJECT
public:
    explicit MyWork(QObject *parent = 0);
    // 添加画图函数
    void drawImage();

signals:
    void imageDone(QImage image);

public slots:
};

#endif // MYWORK_H

MyWork.cpp

#include "mywork.h"
#include <QPainter>

MyWork::MyWork(QObject *parent) : QObject(parent)
{

}

void MyWork::drawImage()
{
    QImage image(600, 600, QImage::Format_RGB32);
    QPainter p(&image);

    // 设置画笔
    p.setPen(QPen(Qt::blue, 10));
    // 设置画刷
    p.setBrush(Qt::red);

    // 画多边形
    QPoint points[] =
    {
        QPoint(qrand()%500, qrand()%500),
        QPoint(qrand()%500, qrand()%500),
        QPoint(qrand()%500, qrand()%500),
        QPoint(qrand()%500, qrand()%500),
        QPoint(qrand()%500, qrand()%500),
    };
    p.drawPolygon(points, 5);
    // 将图片发给主线程
    emit imageDone(image);
}

2.主界面类

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "mywork.h"
#include <QThread>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = 0);
    ~MyWidget();

protected:
    void paintEvent(QPaintEvent *);

private:
    Ui::MyWidget *ui;
    MyWork *m_work;
    QThread *m_thread;
    QImage m_img;
};

#endif // MYWIDGET_H

MyWidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPainter>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    // 实例化两个对象
    m_work = new MyWork;
    m_thread = new QThread(this);
    //
    m_work->moveToThread(m_thread);
    // 启动子线程
    m_thread->start();

    // 收到按钮按下的信号, 开始画图
    connect(ui->drawImage, &QPushButton::clicked, m_work, &MyWork::drawImage);

    //
    connect(m_work, &MyWork::imageDone, [=](QImage image)
    {
        // 将接收的图片画到当前窗口
        m_img = image;
        // 手动刷新窗口
        update();
    });

    //
    connect(this, &MyWidget::destroyed, [=]()
    {
       m_thread->quit();
       m_thread->wait();
       delete m_work;
    });
}

MyWidget::~MyWidget()
{
    delete ui;
//    delete m_work;
}

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawImage(50, 50, m_img);
}

3.main函数

#include "mywidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/jiang_xinxing/article/details/79275280