Qt 下使用线程绘图

 通过pushbutton关联槽函数自定义线程drawImage,drawImage画图绘制完,发送updateImage(QImage image_date)信号 发送给对应的槽函数getImage(QImage)接收QImage图片,update()会自动调用paintEvent()来绘制图像。

#ifndef WIDGET_H
#define WIDGET_H
//https://blog.csdn.net/CSDNZSX/article/details/86160488
#include 
#include"mythread.h"
#include
#include
#include

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void paintEvent(QPaintEvent *event);//重新绘图事件

    void getImage(QImage);
    void kill_thread();
private:
    Ui::Widget *ui;
    QImage image; //
   Mythread *myT;//xiancheng;
   QThread *thread;

};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
//https://blog.csdn.net/CSDNZSX/article/details/86160488
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);
    //子线程绘图函数 drawImage()必须通过 signals-- slots来调用实现
    connect(myT,&Mythread::updataImage,this,&Widget::getImage);

    connect(this,&Widget::destroyed,this,&Widget::kill_thread);
}
void Widget::getImage(QImage temp)
{
     image=temp;//// 用于接受子线程传回来的图像
     update();//更新窗口,间接调用paintEvent绘画
}

void Widget::paintEvent(QPaintEvent* )
{
    QPainter p(this);
    p.drawImage(50,50,image);//https://blog.csdn.net/qq_41769322/article/details/89791056
}
void Widget::kill_thread()
{
    thread->quit();//退出子线程
    thread->wait();//处理子线程所占用的资源
    delete thread;//由于test_thread没有指定父对象 需要自己处理
}
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include 
#include
class Mythread : public QObject
{
    Q_OBJECT
public:
    explicit Mythread(QObject *parent = 0);
    void drawImage();
signals:
    void updataImage(QImage tmp);
public slots:
};
#endif // MYTHREAD_H


void Mythread::drawImage()
{
    //绘画设备
    QImage image(500,500,QImage::Format_ARGB32);
    QPainter p(&image);//定义画家 指定绘画设备

    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),
    };

    QPen pen;
    pen.setWidth(5);//定义画笔
    p.setPen(pen);  //画笔交给画家
    QBrush brush;  //画刷
    brush.setStyle(Qt::SolidPattern); //样式
    brush.setColor(Qt::blue);  //颜色
    p.setBrush(brush);
    p.drawPolygon(a,5);  //五边形

    emit updataImage(image);
}

 

 

你可能感兴趣的:(QT)