在qt中对于后台数据处理比较耗时情况下,如果放在UI主线程中来处理,给人一种卡顿的感觉,可以将耗时的部分放在次线程中来处理,主线程来显示处理进度。
在次线程中处理时,需要将处理进度信息传给UI线程,只需要在次线程中添加信号,主线程中添加对应的槽函数就可以了
处理线程头文件如下:
#ifndef PROCESSTHREAD_H
#define PROCESSTHREAD_H
#include <QObject>
#include <QThread>
class processThread : public QThread
{
Q_OBJECT
public:
processThread(QObject *parent = 0);
~processThread();
protected:
void run();
signals:
void processStart(const QString &); //处理开始的信号
void processEnd(const QString &); //处理结束的信号
};
#endif // PROCESSTHREAD_H
处理线程源代码:
#include "processthread.h"
processThread::processThread(QObject *parent)
:QThread(parent)
{
}
processThread::~processThread()
{
}
void processThread::run()
{
emit processStart(QStringLiteral("开始"));
QThread::sleep(30); //这里根据需要添加处理过程,暂时模拟休眠30s
emit processEnd(QStringLiteral("结束"));
}
UI主线程中添加处理线程和进度对话框成员变量,头文件代码为:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "processthread.h"
#include <QProgressDialog>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void processStart(const QString&);
void processEnd(const QString&);
private:
Ui::MainWindow *ui;
QProgressDialog progressDialog;
processThread thread;
};
#endif // MAINWINDOW_H
UI主线程中源代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&thread, SIGNAL(processStart(const QString&)), this, SLOT(processStart(const QString&)));
connect(&thread, SIGNAL(processEnd(const QString&)), this, SLOT(processEnd(const QString&)));
}
MainWindow::~MainWindow()
{
thread.wait();
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
thread.start();//启动处理线程
}
void MainWindow::processStart(const QString&)
{
progressDialog.setRange(0, 0);
progressDialog.setWindowTitle(QStringLiteral("处理")); //设置进度对话框标题
progressDialog.setLabelText(QStringLiteral("处理中..."));//设置进度对话框显示文本
progressDialog.exec();
}
void MainWindow::processEnd(const QString&)
{
progressDialog.close();//关闭进度对话框
}
界面显示为
点击处理,弹出进度对话框