mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QImage>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
// 线程处理函数
void drawImage();
signals:
void updateImage(QImage temp);
public slots:
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
MyThread::MyThread(QObject *parent) : QObject(parent)
{
}
void MyThread::drawImage()
{
// 定义QImage绘图设备
QImage image(500, 500, QImage::Format_ARGB32);
// 定义画家,指定绘图设备
QPainter p(&image);
// 定义画笔对象
QPen pen;
pen.setWidth(5); // 设置宽度
p.setPen(pen); // 把画笔交给画家
// 定义画刷
QBrush brush;
brush.setStyle(Qt::SolidPattern); // 设置样式
brush.setColor(Qt::red); // 设置颜色
p.setBrush(brush);
// 定义5个点
QPoint a[5] = {
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(a, 5);
// 通过信号发送图片
emit updateImage(image);
}
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QImage>
#include "mythread.h"
#include <QThread>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
// 重写绘图事件
void paintEvent(QPaintEvent *);
// 获取图片
void getImage(QImage temp);
// 关闭线程
void dealClose();
private:
Ui::MyWidget *ui;
QImage image; // 图片指针变量
MyThread *myT; // 自定义线程对象
QThread *thread; // 子线程
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPainter>
#include <QThread>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
// 自定义对象分配空间
myT = new MyThread;
// 创建子进程
thread = new QThread(this);
// 把自定义模块添加到子线程
myT->moveToThread(thread);
// 启动子线程,但是并没有启动线程处理函数
thread->start();
// 线程处理函数必须通过signal - slot 调用
connect(ui->pushButton, &QPushButton::clicked, myT, &MyThread::drawImage);
// 接收线程传来的图片
connect(myT, &MyThread::updateImage, this, &MyWidget::getImage);
// 关闭线程
connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::dealClose()
{
// 退出子线程
thread->quit();
// 回收资源
thread->wait();
// 删除自定义线程
delete myT;
}
// 接收图片
void MyWidget::getImage(QImage temp)
{
image = temp;
update(); // 更新窗口,间接调用paintEvent()
}
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter p(this); // 创建画家,指定绘图设备为窗口
p.drawImage(50, 50, image);
}