码迷,mamicode.com
首页 > 编程语言 > 详细

30线程画图

时间:2018-06-23 01:43:47      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:图片显示   move   nal   public   als   生成   signal   主线程   组成   

多线程绘图

前面见过Image绘图设备可以运用在线程中。

技术分享图片

 

 

本例子。在线程中随机画出一个多边形,通过信号将图片发出,在主线程中接受该图片,并在绘图事件中绘制。

在窗口中有一个按钮,当点击按钮之后,在线程中绘制一张图片,然后将绘制好的图片显示到当前窗口中。

子线程随机画图解析

class MyThread : public QObject

{

    void DrawImage();   //自拟线程处理函数

signals:

void updateImage(QImage temp);  //自拟信号

}

 

//实现线程处理函数

void MyThread::DrawImage()

{

    //定义iamge绘图设备

    QImage image(400,400,QImage::Format_ARGB32);

   

    //定义画家,指定绘图设备

    QPainter p(&image);

 

    //定义画笔

    QPen pen;

    pen.setWidth(5);            //画笔粗细

    pen.setStyle(Qt::SolidLine);//画笔样式

    //将画笔交给画家

    p.setPen(pen);

 

    //定义画刷

    QBrush brush;

    brush.setStyle(Qt::SolidPattern);//画刷样式

    brush.setColor(Qt::red);    //画刷颜色

    //将画刷交给画家

    p.setBrush(brush);

   

    //随机生成5个点,组成一个多边形

    QPoint arr[]=

    {

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400)

    };

   

    //画多边形

    p.drawPolygon(arr,5);

 

    //发出信号,并将图片发出

    emit updateImage(image);

 

}

 

主线程接受图片,并绘制图片解析

 

    //按下按钮,调用线程的线程处理函数

    connect(ui->pushButton,&QPushButton::pressed,m_myThread,&MyThread::DrawImage);

    //接受信号,取出图片

connect(m_myThread,&MyThread::updateImage,this,&Widget::GetImage);

 

void Widget::GetImage(QImage temp)

{

    m_image=temp;   //取出图片

    update();       //更新

}

 

void Widget::paintEvent(QPaintEvent *)

{

    //绘图

    QPainter p(this);

    p.drawImage(100,100,m_image);

}

 技术分享图片

 

 

 

 

源代码:

mythread.h

#ifndef MYTHREAD_H

#define MYTHREAD_H

 

#include <QObject>

#include <QImage>

 

class MyThread : public QObject

{

    Q_OBJECT

public:

    explicit MyThread(QObject *parent = 0);

   

    void DrawImage();   //自拟线程处理函数

signals:

    void updateImage(QImage temp);  //自拟信号

public slots:

 

};

 

#endif // MYTHREAD_H

 

 

mythread.cpp

#include "mythread.h"

#include <QPainter>

#include <QPen>

#include <QBrush>

 

MyThread::MyThread(QObject *parent) :

    QObject(parent)

{

}

 

//实现线程处理函数

void MyThread::DrawImage()

{

    //定义iamge绘图设备

    QImage image(400,400,QImage::Format_ARGB32);

   

    //定义画家,指定绘图设备

    QPainter p(&image);

 

    //定义画笔

    QPen pen;

    pen.setWidth(5);            //画笔粗细

    pen.setStyle(Qt::SolidLine);//画笔样式

    //将画笔交给画家

    p.setPen(pen);

 

    //定义画刷

    QBrush brush;

    brush.setStyle(Qt::SolidPattern);//画刷样式

    brush.setColor(Qt::red);    //画刷颜色

    //将画刷交给画家

    p.setBrush(brush);

   

    //随机生成5个点,组成一个多边形

    QPoint arr[]=

    {

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400),

        QPoint(qrand()%400,qrand()%400)

    };

   

    //画多边形

    p.drawPolygon(arr,5);

 

    //发出信号,并将图片发出

    emit updateImage(image);

 

}

 

 

 

widget.h

#ifndef WIDGET_H

#define WIDGET_H

 

#include <QWidget>

#include "mythread.h"

#include <QPaintEvent>

#include <QThread>

#include <QImage>

 

namespace Ui {

class Widget;

}

 

class Widget : public QWidget

{

    Q_OBJECT

 

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

    void paintEvent(QPaintEvent *); //绘图事件  

public slots:

    void GetImage(QImage temp);     //通过信号取出图片

signals:

    void startDraw();              

 

private:

    Ui::Widget *ui;

 

    MyThread *m_myThread;           //自定义线程对象

    QThread *m_thread;              //子线程

 

    QImage m_image;                 //图片

 

};

 

#endif // WIDGET_H

 

 

 

widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QPainter>

 

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    this->resize(600,600);

 

    //自定义类对象,不可以指定父对象

    m_myThread=new MyThread;

    //创建子线程

    m_thread=new QThread(this);

    //将自定义模块附加到子线程

    m_myThread->moveToThread(m_thread);

 

//方式二:用按钮来启动线程,再发出信号,来调用线程处理函数

//    connect(ui->pushButton,&QPushButton::pressed,

//            [=]()

//            {

//                m_thread->start();

//                emit startDraw();

//            }

//    );

//connect(this,&Widget::startDraw,m_myThread,&MyThread::DrawImage);

 

    //启动线程,但不启动线程处理函数

    m_thread->start();

    //按下按钮,调用线程的线程处理函数

    connect(ui->pushButton,&QPushButton::pressed,m_myThread,&MyThread::DrawImage);

    //接受信号,取出图片

    connect(m_myThread,&MyThread::updateImage,this,&Widget::GetImage);

}

 

Widget::~Widget()

{

    delete ui;

}

 

void Widget::GetImage(QImage temp)

{

    m_image=temp;   //取出图片

    update();       //更新

}

 

void Widget::paintEvent(QPaintEvent *)

{

    //绘图

    QPainter p(this);

    p.drawImage(100,100,m_image);

}

 

30线程画图

标签:图片显示   move   nal   public   als   生成   signal   主线程   组成   

原文地址:https://www.cnblogs.com/gd-luojialin/p/9215856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!