Qt-Day14-学习笔记

Qt-Day14-学习笔记_第1张图片

线程的运用

  • 1. Qt 线程绘图
  • 2. MVC模型
  • 3. connect 函数的第五个函数

1. Qt 线程绘图

Qt-Day14-学习笔记_第2张图片

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


    //4.1 创建线程对象(QThread 自定义线程类)
    pThread = new QThread(this);
    pMyThread = new MyQThread;
    //4.2 添加(让自定义线程类对象成为QThread类对象的子对象)
    pMyThread->moveToThread(pThread);
    //4.3 启动线程 QThread::start();
    pThread->start();
    //每当按下按钮,就执行线程函数
    connect(ui->pushButton,&QPushButton::pressed,
            pMyThread,&MyQThread::drawImage,//Qt::AutoConnection);
            //Qt::DirectConnection);
            Qt::QueuedConnection);

    qDebug() << "主线程线程号:" << QThread::currentThread();

    //4.4 处理线程对象发来的信号
    connect(pMyThread,&MyQThread::sendImage,this,&Widget::recvImage);
    //4.5 线程结束
    connect(this,&QWidget::destroyed,this,&Widget::closeThread);
}

//对应自定义信号类中的 sendImage信号
void Widget::recvImage(QImage image){
    this->image = image;//接受,用成员变量存储接受过来的QImage对象
    update();//刷新界面
}

void Widget::paintEvent(QPaintEvent *event){
    QPainter p(this);

    p.drawImage(40,40,image);
}
void Widget::closeThread(){
    pThread->quit();
    pThread->wait();
    delete pMyThread;
}
Widget::~Widget()
{
    delete ui;
}


#include "myqthread.h"



MyQThread::MyQThread(QObject *parent) : QObject(parent)
{

}

//线程处理函数  相当于 4.7之前版本的 run函数
void MyQThread::drawImage(){
    //1 准备画图  QImage对象 画家QPainter 画笔 QPen 画刷 QBrush
    QImage image(600,600,QImage::Format_ARGB32);

    QPainter p(&image);
    //QPainter p;
    //p.begin(&image);p.end();

    QPen pen;
    pen.setWidth(3);
    p.setPen(pen);

    QBrush brush;
    brush.setStyle(Qt::Dense7Pattern);
    p.setBrush(brush);
    //2 生成六个点
    QPoint pos[6] = {
        QPoint(qrand()%600,qrand()%600),QPoint(qrand()%600,qrand()%600),
        QPoint(qrand()%600,qrand()%600),QPoint(qrand()%600,qrand()%600),
        QPoint(qrand()%600,qrand()%600),QPoint(qrand()%600,qrand()%600)
    };
    //3 把六个点画到QImage里面去
    p.drawPolygon(pos,6);

    static int i=0;
    qDebug() << "分支线程创建QImage:"<<i++;
    qDebug() << "分支线程线程号:" << QThread::currentThread();
    //4 发送信号  把QImage 发送到 主线程里面去
    emit sendImage(image);
}

Qt-Day14-学习笔记_第3张图片

2. MVC模型

Qt-Day14-学习笔记_第4张图片

3. connect 函数的第五个函数

Qt-Day14-学习笔记_第5张图片

你可能感兴趣的:(学习笔记,qt)