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();
}