线程画图流程图
widget.ui文件
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mythread.h"
#include <QThread>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
//重写绘图事件
void paintEvent(QPaintEvent *);
//槽函数
void getImage(QImage temp);
private:
Ui::Widget *ui;
QImage image;
MyThread *myT; //自定义线程对象
QThread *thread; //子线程
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//自定义线程对象分配空间,不可以指定父对象
myT = new MyThread;
//创建子线程
thread = new QThread(this);
//将自定义线程添加到子线程
myT->moveToThread(thread);
//启动子线程,但是并没有启动线程处理函数
thread->start();
//线程处理函数,必须通过信号和槽机制调用
connect(ui->pushButton, &QPushButton::pressed, myT, &MyThread::drawImage);
connect(myT, &MyThread::updateImage, this, &Widget::getImage);
connect(this, &Widget::destroyed, this, [=](){
//退出子线程
thread->quit();
//回收资源
thread->wait();
delete myT;
});
}
//槽函数
void Widget::getImage(QImage temp)
{
this->image = temp;
update(); //更新窗口,间接调用paintEvent()函数
}
Widget::~Widget()
{
delete ui;
}
//重写绘图事件
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.drawImage(50, 50, this->image);
}
mythread.h
mythread. cpp
#include "mythread.h"
#include <QPoint>
#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[] = {
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);
}
结果展示