image.png
image.png

mythread.h

  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QObject>
  4. #include <QImage>
  5. class MyThread : public QObject
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit MyThread(QObject *parent = nullptr);
  10. // 线程处理函数
  11. void drawImage();
  12. signals:
  13. void updateImage(QImage temp);
  14. public slots:
  15. };
  16. #endif // MYTHREAD_H

mythread.cpp

  1. #include "mythread.h"
  2. #include <QPainter>
  3. #include <QPen>
  4. #include <QBrush>
  5. MyThread::MyThread(QObject *parent) : QObject(parent)
  6. {
  7. }
  8. void MyThread::drawImage()
  9. {
  10. // 定义QImage绘图设备
  11. QImage image(500, 500, QImage::Format_ARGB32);
  12. // 定义画家,指定绘图设备
  13. QPainter p(&image);
  14. // 定义画笔对象
  15. QPen pen;
  16. pen.setWidth(5); // 设置宽度
  17. p.setPen(pen); // 把画笔交给画家
  18. // 定义画刷
  19. QBrush brush;
  20. brush.setStyle(Qt::SolidPattern); // 设置样式
  21. brush.setColor(Qt::red); // 设置颜色
  22. p.setBrush(brush);
  23. // 定义5个点
  24. QPoint a[5] = {
  25. QPoint(qrand()%500, qrand()%500),
  26. QPoint(qrand()%500, qrand()%500),
  27. QPoint(qrand()%500, qrand()%500),
  28. QPoint(qrand()%500, qrand()%500),
  29. QPoint(qrand()%500, qrand()%500)
  30. };
  31. // 开始绘图
  32. p.drawPolygon(a, 5);
  33. // 通过信号发送图片
  34. emit updateImage(image);
  35. }

mywidget.h

  1. #ifndef MYWIDGET_H
  2. #define MYWIDGET_H
  3. #include <QWidget>
  4. #include <QImage>
  5. #include "mythread.h"
  6. #include <QThread>
  7. namespace Ui {
  8. class MyWidget;
  9. }
  10. class MyWidget : public QWidget
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit MyWidget(QWidget *parent = 0);
  15. ~MyWidget();
  16. // 重写绘图事件
  17. void paintEvent(QPaintEvent *);
  18. // 获取图片
  19. void getImage(QImage temp);
  20. // 关闭线程
  21. void dealClose();
  22. private:
  23. Ui::MyWidget *ui;
  24. QImage image; // 图片指针变量
  25. MyThread *myT; // 自定义线程对象
  26. QThread *thread; // 子线程
  27. };
  28. #endif // MYWIDGET_H

mywidget.cpp

  1. #include "mywidget.h"
  2. #include "ui_mywidget.h"
  3. #include <QPainter>
  4. #include <QThread>
  5. MyWidget::MyWidget(QWidget *parent) :
  6. QWidget(parent),
  7. ui(new Ui::MyWidget)
  8. {
  9. ui->setupUi(this);
  10. // 自定义对象分配空间
  11. myT = new MyThread;
  12. // 创建子进程
  13. thread = new QThread(this);
  14. // 把自定义模块添加到子线程
  15. myT->moveToThread(thread);
  16. // 启动子线程,但是并没有启动线程处理函数
  17. thread->start();
  18. // 线程处理函数必须通过signal - slot 调用
  19. connect(ui->pushButton, &QPushButton::clicked, myT, &MyThread::drawImage);
  20. // 接收线程传来的图片
  21. connect(myT, &MyThread::updateImage, this, &MyWidget::getImage);
  22. // 关闭线程
  23. connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);
  24. }
  25. MyWidget::~MyWidget()
  26. {
  27. delete ui;
  28. }
  29. void MyWidget::dealClose()
  30. {
  31. // 退出子线程
  32. thread->quit();
  33. // 回收资源
  34. thread->wait();
  35. // 删除自定义线程
  36. delete myT;
  37. }
  38. // 接收图片
  39. void MyWidget::getImage(QImage temp)
  40. {
  41. image = temp;
  42. update(); // 更新窗口,间接调用paintEvent()
  43. }
  44. void MyWidget::paintEvent(QPaintEvent *)
  45. {
  46. QPainter p(this); // 创建画家,指定绘图设备为窗口
  47. p.drawImage(50, 50, image);
  48. }