Qt5:多线程处理与使用之三(Qt5的方法,再次写一个小程序熟悉下)
项目思路:
工程: 界面UI:
运行:
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QThread>
#include "mythread.h"
#include <QImage>
#include <QPainter>
namespace Ui {
class mainWidget;
}
class mainWidget : public QWidget
{
Q_OBJECT
public:
explicit mainWidget(QWidget *parent = 0);
~mainWidget();
//重写绘图事件
void paintEvent(QPaintEvent *event);
//槽函数
void getImage(QImage temp);
//关闭主窗口时候,关闭子线程
void dealClose();
private:
Ui::mainWidget *ui;
QImage image; //绘图的画板
MyThread *myThread;
QThread *thread;
};
#endif // MAINWIDGET_H
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QThread>
#include <QImage>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
//线程处理函数,这个线程里面进行绘画图形
void drawImage();
signals:
//画图完毕信号
void updateImage(QImage temp);
public slots:
};
#endif //
main.cpp
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mainWidget w;
w.show();
return a.exec();
}
mainwidget.cpp
#include "mainwidget.h"
#include "ui_mainwidget.h"
mainWidget::mainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::mainWidget)
{
ui->setupUi(this);
//创建子线程
thread = new QThread(this);
//创建一个(有线程处理函数的)类。(用于加载子线程)
myThread = new MyThread;
//将子线程加载到类里面(类里面写好了线程处理函数)
myThread->moveToThread(thread);
//启动子线程,但是线程处理函数是没有实现的
thread->start();
//线程处理函数,必须通过signal-slot来启动
//点击主界面按钮, 线程处理函数启动工作
connect(ui->pushButton, &QPushButton::pressed, myThread, &MyThread::drawImage);
//收到子线程完成绘图工作的信号, 启动相应的槽函数
connect(myThread, &MyThread::updateImage, this, &mainWidget::getImage);
//关闭子线程
connect(this, &mainWidget::destroyed, this, &mainWidget::dealClose);
}
mainWidget::~mainWidget()
{
delete ui;
}
void mainWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this); //创建画家, 指定绘图设备为窗口
p.drawImage(50, 50, image);
}
//槽函数
void mainWidget::getImage(QImage temp)
{
image = temp;
update(); //更新窗口,间接调用PaintEvent()
}
void mainWidget::dealClose()
{
//退出子线程
thread->quit();
//当子线程结束后,完成相关的资源回收工作
thread->wait();
//因为(作为子线程加载)的类没有指定父对象, 所以在这里手动回收
delete myThread;
}
mythread.cpp
#include "mythread.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
MyThread::MyThread(QObject *parent) : QObject(parent)
{
}
void MyThread::drawImage()
{
//设置Qimage绘图设备
QImage image(500, 500, QImage::Format_ARGB32);
//定义画家,指定绘图设备
QPainter p(&image);
//设置画笔
QPen pen;
pen.setWidth(5);
p.setPen(pen); //把画笔交给画家
//设置画刷
QBrush brush;
brush.setStyle(Qt::Dense1Pattern);
brush.setColor(Qt::red);
p.setBrush(brush); //把画刷交给画家
//随机定义五个点
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)
};
//按照点的先后顺序,将其连接成为多边形
p.drawPolygon(a, 5);
//通过信号发送图片
emit updateImage(image);
}