QT creater 非UI线程绘图


刚开始学习QT,只懂一点c的语法,折腾了好长时间才实现了功能,
言归正传。
实现过程是ui线程只进行显示,不用来做大量的图像绘制工作,开一个子线程,将绘图工作单独放到一个类中,运行时将其移入子线程,绘图完成后绘图类发送信号给主线程,并将绘图结果传给主线程,主线程只进行了显示工作,不会出现卡顿或卡死现象。
新人,懂得少,若有什么说的不恰当的地方还望各位大神多多指教。

上代码:

主界面程序cpp

#include "QtGui.h"
#include "MyDialog.h"
#include <QDebug>
#include <QFileDialog>
#include <QFileInfo>
#include <QApplication>
#include <qpainter.h>
QtGui::QtGui(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    simple=new SimpleThread;
    child=new QThread;
    simple->moveToThread(child);
    child->start();
    connect(this,SIGNAL(SignalChild()),simple,SLOT(print_str()));
    connect(simple ,SIGNAL(send()),this,SLOT(receive()));
}
void  QtGui::imageclick()
{
    emit SignalChild();
    return ;
}
void QtGui::receive()
{
     abc=simple->getImage();
     QPixmap mp;
     mp=mp.fromImage(abc);
     ui.label_3->setPixmap(mp);
     ui.label_3->resize(QSize(abc.width(),abc.height()));
     ui.label_3->setScaledContents(true);
     ui.label_3->show();
}

主界面程序头文件

#pragma once
#include "ui_QtGui.h"
#include <QtWidgets/QMainWindow>
#include <QMessageBox>
#include<QThread>
#include<simplethread.h>
#include<childwidget.h>
class QtGui : public QMainWindow {
   
    Q_OBJECT

public:
    QtGui(QWidget *parent = Q_NULLPTR);
private:
    Ui::QtGuiClass ui;
    QThread *child;
    SimpleThread *simple;
    QImage abc;


private slots:
    void imageclick();
    void receive();
signals:
    void SignalChild();


};

代码块

子线程头文件

#ifndef CHILDWIDGET_H
#define CHILDWIDGET_H

#include <QThread>
#include <QtCore>

class ChildWidget : public QThread {
   
     Q_OBJECT
public:
    ChildWidget();
    void run();

};

#endif // CHILDWIDGET_H

子线程cpp

#include "childwidget.h"

ChildWidget::ChildWidget()
{
}

void ChildWidget::run()
{
    exec();
    return ;
}

绘图头文件

#ifndef SIMPLETHREAD_H
#define SIMPLETHREAD_H

#include <QObject>
#include <QtCore>
#include<QPainter>
#include <QLabel>

class SimpleThread : public QObject {
   
     Q_OBJECT
public:
    SimpleThread();
    QImage m;
    void setImage(QImage image)
    {
        m=image;
    }
    QImage getImage()
    {
        return m;
    }
signals:
       void send();
private slots:
     void print_str();

};

#endif // SIMPLETHREAD_H

绘图cpp

#include "simplethread.h"

SimpleThread::SimpleThread()
{

}

 void SimpleThread::print_str()
{
    static QImage image(1000, 1000, QImage::Format_RGB32);
    QRgb value;
    //将图片背景填充为白色
    image.fill(Qt::white);
    value = qRgb(r, g, b);
    for(int i=0;i<1000;i++)
    for(int j=0;j<1000;j++)
    {
           image.setPixel(i,j,value);
    }
       setImage(image);
       emit send();
}

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtGui w;
    w.show();
    return a.exec();
}

关键代码都在这了

希望有小伙伴一起来学习QT还有遥感的知识