qt中对任务繁忙时QProgressDialog的使用

来源:互联网 发布:lol引燃伤害数据 编辑:程序博客网 时间:2024/06/06 01:47

在qt中对于后台数据处理比较耗时情况下,如果放在UI主线程中来处理,给人一种卡顿的感觉,可以将耗时的部分放在次线程中来处理,主线程来显示处理进度。

在次线程中处理时,需要将处理进度信息传给UI线程,只需要在次线程中添加信号,主线程中添加对应的槽函数就可以了

处理线程头文件如下:

#ifndef PROCESSTHREAD_H#define PROCESSTHREAD_H#include <QObject>#include <QThread>class processThread : public QThread{     Q_OBJECTpublic:    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_OBJECTpublic:    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();//关闭进度对话框}

界面显示为

点击处理,弹出进度对话框




0 0