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
#include
#include
#include