Qt 下使用线程绘图

1、自己创建一个类 myThread
1).创建一个类 myThread 继承与 QObject

class myThread : public QObject

2).在类 myThread 中定义信号void updateImage(QImage image_date) 当图形绘制完成发送给对应的槽函数

3).在类 myThread 中定义子线程绘图函数drawImage()用于画图
2、在 主窗口类 myWidget 中创建子线程
2.1 在 mywidget.h 中声明

//声明自定义模块
myThread *test_thread;

//用于接受绘制的图像
QImage myThread_image;

//声明自定义线程·
QThread *thread;

//重定义绘图事件函数
void paintEvent(QPaintEvent *);    

//画图像的槽函数
void getImage(QImage);

//用于关闭窗口时关闭自己创建的子线程的槽函数
void kill_thread();

2.2 在mywidget.c 中实现思路

//为自定义的模块分配空间  不能指定父对象
test_thread = new myThread;

//为自定义的子线程分配空间  指定父对象 
thread= new QThread(this);

//把自定义模块添加到子线程
test_thread->moveToThread(thread);

//启动子线程  但是没有启动子线程处理函数    
thread->start(); 

//子线程绘图函数 drawImage()必须通过 signals-- slots来调用实现
connect(ui->DrawButton , &QPushButton::pressed , test_thread , &myThread::drawImage);

//将子线程绘制完成时发出的信号与自定义槽函数getImage(QImage)连接起来
connect(test_thread , &myThread::updateImage , this , &myWidget::getImage);

//*************退出窗口时 关闭子线程*************
connect(this, &myWidget::destroyed, this , &myWidget::kill_thread);

2.3 各个函数的具体实现
2.3.1 自定义的子线程绘图函数

  void myThread::drawImage()
    {
        //定义绘图设备
        QImage  image(500, 500 ,QImage::Format_ARGB32);
        //定义画家
        QPainter  Painter(&image);
        //定义画笔
        QPen pen;
        pen.setWidth(3); 			//设置线宽
        Painter.setPen(pen);	//将画笔转移给 Painter
        //定义画刷
        QBrush  brush;
        brush.setColor(Qt::green);				//设置画刷颜色
        brush.setStyle(Qt::SolidPattern);	//设置画刷风格
        Painter.setBrush(brush);					//将画刷转移给 Painter
        //定义要画的点   随机生成5个点
        QPoint point[]=
        {
            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),
        };
        //画多边形
        Painter.drawPolygon(point, 5);
        //发送绘制完成信号,同时将绘制的图像发送给对应的槽函数
        emit updateImage(image);
    }

2.3.2 重定义绘图事件函数paintEvent(QPaintEvent *)

void myWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawImage(50,50,myThread_image);
}

2.3.3自定义槽函数getImage(QImage)

void myWidget::getImage(QImage temp)
{
    // 用于接受子线程传回来的图像
    myThread_image=temp; 
    
    //update()会自动调用paintEvent()来绘制图像
    update();
}

2.3.4 关闭自定义线程

void myWidget::kill_thread()
{
    //退出子线程
    thread->quit();
    //处理子线程所占用的资源
    thread->wait();
    //由于test_thread没有指定父对象 需要自己处理
    delete  test_thread;
}

注:需要头文件

#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QImage>
发布了24 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CSDNZSX/article/details/86160488