点击按钮一次,就会画出一个五边形
思路讲解:
先点击按钮:
connect(ui->pushButton,&QPushButton::pressed,myt,&myThread::drawImage);
调用drawImage处理函数
创造的线程处理函数,先在500*500的大小下画一个五边形
void myThread::drawImage()
{
//定义绘图设备
QImage image(500,500,QImage::Format_ARGB32);
//定义画家
QPainter painter(&image);
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)
};
QPen pen;
pen.setWidth(5);
//把画笔交给画家
painter.setPen(pen);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(Qt::red);
//把画家交给画家
painter.setBrush(brush);
painter.drawPolygon(point,5);
//发送图片
//通过信号
emit updateImage(image);
}
发送了uodateImage信号以后
connect(myt,&myThread::updateImage,this,&myWidget::getImage)
void myWidget::getImage(QImage temp)
{
image=temp;
update();//更新窗口,间接调用paintEvent
}
painEvent:
void myWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);//画家指定窗口为绘图窗口
p.drawImage(50,50,image);
}
总代码:
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include<QImage>
class myThread : public QObject
{
Q_OBJECT
public:
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<QImage>
#include<QBrush>
#include<QPen>
myThread::myThread(QObject *parent) : QObject(parent)
{
}
void myThread::drawImage()
{
//定义绘图设备
QImage image(500,500,QImage::Format_ARGB32);
//定义画家
QPainter painter(&image);
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)
};
QPen pen;
pen.setWidth(5);
//把画笔交给画家
painter.setPen(pen);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(Qt::red);
//把画家交给画家
painter.setBrush(brush);
painter.drawPolygon(point,5);
//发送图片
//通过信号
emit updateImage(image);
}
mywidge.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include<QImage>
#include<QThread>
#include"mythread.h"
namespace Ui {
class myWidget;
}
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
void paintEvent(QPaintEvent *event);
void getImage(QImage);//槽函数
void stopThread();
signals:
private:
Ui::myWidget *ui;
QImage image;
myThread *myt;//自定义线程
QThread *thread;//子线程
};
#endif // MYWIDGET_H
wywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
#include<QImage>
#include<QBrush>
#include<QThread>
#include<QPen>
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget)
{
ui->setupUi(this);
myt=new myThread;
setBaseSize(500,500);
thread=new QThread(this);
myt->moveToThread(thread);
//启动子线程
thread->start();
//线程处理函数通过信号和曹
connect(ui->pushButton,&QPushButton::pressed,myt,&myThread::drawImage);
connect(myt,&myThread::updateImage,this,&myWidget::getImage);
connect(this,&myWidget::destroyed,this,&myWidget::stopThread);
}
void myWidget::getImage(QImage temp)
{
image=temp;
update();//更新窗口,间接调用paintEvent
}
void myWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);//画家指定窗口为绘图窗口
p.drawImage(50,50,image);
}
void myWidget::stopThread()
{
thread->quit();
thread->wait();
delete myt;
}
myWidget::~myWidget()
{
delete ui;
}