学习QT之进度条

拥有回忆 提交于 2020-03-16 16:58:06

通常,在处理长时间任务是需要提供进度条用于显示时间,告诉用户当前任务的进展情况。进度条对话框的使用方法有两种,即模态和非模态方式。模态方式的使用比较简单方便,但必须使用QApplication::processEvents(),使时间循环保持正常进行状态,以确保应用不会被阻塞;若使用非模态方式,则需要通过QTime实现定时设置进度条的值。

Qt提供了两种显示进度条的方式,一种是QProgressBar,提供了一种横向或纵向显示进度的控件表示方式,用来描述任务的完成情况;另一种是QProgressDialog,提供了一种针对慢速过程的进度对话框表示方式,用于描述任务完成的进度情况。标准的进度条对话框包括一个进度显示条、一个"取消"(Cancel)按钮及一个标签。

以下通过一个实例来介绍它们的使用

一、运行结果

采用进度条的方式显示进度
在这里插入图片描述
采用进度条对话框的方式显示进度
在这里插入图片描述

二、详细代码

progressdlg.h

#ifndef PROGRESSDLG_H
#define PROGRESSDLG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QProgressBar>
#include <QComboBox>
#include <QPushButton>
#include <QGridLayout>

class ProgressDlg : public QDialog
{
    Q_OBJECT
public:
    ProgressDlg(QWidget *parent = 0);
    ~ProgressDlg();

private slots:
    void startProgress();

private:
    QLabel *FileNum;
    QLineEdit *FileNumLineEdit;
    QLabel *ProgressType;
    QComboBox *comboBox;
    QProgressBar *progressBar;
    QPushButton *starBtn;
    QGridLayout *mainLayout;
};

#endif // PROGRESSDLG_H

progressdlg.cpp

#include "progressdlg.h"
#include <QProgressDialog>
#include <QFont>

ProgressDlg::ProgressDlg(QWidget *parent)
    : QDialog(parent)
{
    QFont font("ZYSong18030",12);
    setFont(font);
    setWindowTitle(tr("Progress"));
    FileNum = new QLabel;
    FileNum->setText(tr("文件数目:"));
    FileNumLineEdit = new QLineEdit;
    FileNumLineEdit->setText(tr("100000"));
    ProgressType = new QLabel;
    ProgressType->setText(tr("显示类型:"));
    comboBox = new QComboBox;
    comboBox->addItem(tr("progressBar"));
    comboBox->addItem(tr("progressDialog"));
    progressBar = new QProgressBar;
    starBtn = new QPushButton;
    starBtn->setText(tr("开始"));
    mainLayout = new QGridLayout(this);
    mainLayout->addWidget(FileNum,0,0);
    mainLayout->addWidget(FileNumLineEdit,0,1);
    mainLayout->addWidget(ProgressType,1,0);
    mainLayout->addWidget(comboBox,1,1);
    mainLayout->addWidget(progressBar,2,0,1,2);
    mainLayout->addWidget(starBtn,3,1);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    connect(starBtn,SIGNAL(clicked(bool)),this,SLOT(startProgress()));
}

ProgressDlg::~ProgressDlg()
{

}

void ProgressDlg::startProgress()
{
    bool ok;
    int num = FileNumLineEdit->text().toInt(&ok);
    if(comboBox->currentIndex() == 0)  //采用进度条的方式显示进度
    {
        progressBar->setRange(0,num);  //设置进度条的步进范围
        for(int i=1;i<=num;i++)
        {
            progressBar->setValue(i);  //设置进度条的数值
        }
    }
    else if(comboBox->currentIndex() == 1)  //采用进度条对话框显示进度
    {
        //创建一个进度条对话框
        QProgressDialog *progressDialog = new QProgressDialog(this);
        QFont font("ZYSong18030",12);
        progressDialog->setFont(font);
        progressDialog->setWindowModality(Qt::WindowModal); //注(1)
        progressDialog->setMinimumDuration(5);  //注(2)
        progressDialog->setWindowTitle(tr("Please Wait"));  //设置进度条对话框的标题名
        progressDialog->setLabelText(tr("Copying..."));  //设计进度条对话框中标签的文字
        progressDialog->setCancelButtonText(tr("Cancel"));  //设计进度条对话框中取消按钮的文字
        progressDialog->setRange(0,num);
        for(int i=1;i<=num;i++)
        {
            progressDialog->setValue(i);
            if(progressDialog->wasCanceled())
                return;
        }
    }
}

注(1):设置进度条对话框采用模态方式进行显示,即在显示进度的同时,其它窗口将不响应信号。

注(2):设置进度条对话框出现需等待的时间,此处设置为5秒,默认是4秒。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!