
mythread.h
#ifndef MYTHREAD_H#define MYTHREAD_H#include <QObject>#include <QImage>class MyThread : public QObject{ Q_OBJECTpublic: 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_OBJECTpublic: 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);}