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.主界面类
#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
#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();
}