Qt5开发从入门到精通——第四篇八节(进度条)

本文详细介绍了Qt中QProgressBar和QProgressDialog的使用方法,包括模态和非模态方式展示进度条。通过代码示例展示了如何设置进度条范围、步进值,并模拟文件复制过程,同时解释了关键代码的作用。此外,还提到了QProgressDialog的属性如窗口模式、等待时间和显示信息等,帮助开发者更好地在实际项目中应用进度条组件。
摘要由CSDN通过智能技术生成

欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀


前言

本章节将会给大家带来进度条的详细使用方法


一、进度条概述

通常,在处理长时间任务时需要提供进度条用千显示时间,告诉用户当前任务的进展情况。进度条对话框的使用方法有两种,即模态方式与非模态方式。模态方式的使用比较简单方便,但必须使用QApplication: :processEvents()使事件循环保待正常进行状态,以确保应用不会被阻塞。若使用非模态方式,则需要通过 QTime 实现定时设置进度条的值。Qt 提供了两种显示进度条的方式:一种是 QProgressBar 提供了一种横向或纵向显示进度的控件表示方式,用来描述任务的完成情况;另一种是 QProgressDialog 提供了 一种针对慢速过程的进度对话框表示方式,用千描述任务完成的进度情况。标准的进度条对话框包括一个进度显示条、一个“取消 (Cancel)" 按钮及一个标签。

二、效果实例

图一

在这里插入图片描述

三、原码解析

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

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

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
void startProgress();
private:
QLabel *FileNum;
QLineEdit *FileNumLineEdit;
QLabel *ProgressType;
QComboBox *comboBox;
QProgressBar *progressBar;
QPushButton *starBtn;
QGridLayout *mainLayout;

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QProgressDialog>
#include <QFont>
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    QFont font("ZYSongl8030",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()), this, SLOT (startProgress()));
}

Dialog::~Dialog()
{

}

void Dialog::startProgress()
{
    bool ok;
    int num =FileNumLineEdit->text().toInt(&ok); // (a)
    if (comboBox->currentIndex()==0) //采用进度条的方式显示进度
    {
    progressBar->setRange (0, num); //(b)
    //progressBar->setFormat("%v");
    for(int i=1;i<num+1;i++)
       {
            progressBar->setValue(i); // (c)
        }
    }else if (comboBox->currentIndex()==1) //采用进度对话框显示进度
     {
             //创建一个进度对话框
            QProgressDialog *progressDialog=new QProgressDialog(this);
            QFont font("ZYSong18030",12);
            progressDialog->setFont(font);
            progressDialog->setWindowModality (Qt::WindowModal); //(d)
            progressDialog->setMinimumDuration(5); //(e)
            progressDialog->setWindowTitle(tr("Please Wait")); //(f)
            progressDialog->setLabelText (tr ("Copying ... ")); //(g)
            progressDialog->setCancelButtonText (tr ("Cancel")) ; //(h)
            progressDialog->setRange(0,num); //设置进度对话框的步进范围

            for(int i=1;i<num+1;i++)
            {
            progressDialog->setValue(i);     //(i)
            if(progressDialog->wasCanceled())  //(j)
            return;
            }
      }
}

其中,
(a) int num =FileNumLineEdit->text().toInt(&ok): 获取当前需要复制的文件数目,这里对应进度条的总步进值。
(b)progressBar->setRange (0, num):设置进度条的步进范围从 0 到需要复制的文件数目。
(c)progressBar->setValue(i):模拟每一个文件的复制过程,进度条总的步进值为需要复制
的文件数目。当复制完一个文件后,步进值增加 1 。
(d)progressDialog->setWindowModality (Qt::WindowModal):设置进度对话框采用模态方
式进行显示,即在显示进度的同时,其他窗口将不响应输入信号。
(e)progressDialog->setMinimumDuration(5):设置进度对话框出现需等待的时间,此处设
定为 5 秒 (s), 默认为 4 秒。
(f)progressDialog->setWindowTitle(tr(“Please Wait”)):设置进度对话框的窗体标题。
(g)progressDialog->setLabelText (tr ("Copying … ")):设置进度对话框的显示文字信息。
(h)progressDialog->setCancelButtonText (tr (“Cancel”)):设置进度对话框的“取消”按钮
的显示文字。
(i) progressDialog->setValue(i):模拟每个文件的复制过程,进度条总的步进值为需要复制
的文件数目。当复制完一个文件后,步进值增加 1 。
(j)if(progressDialog->wasCanceled()):检测“取消”按钮是否被触发,若触发则退出循环
并关闭进度对话框。
(4) 运行程序,查看显示效果。
QProgressBar 类有如下几个重要的属性。

  • minimum 、 maximum: 决定进度条指示的最小值和最大值。
  • format: 决定进度条显示文字的格式,可以有三种显示格式,即 %p% 、%v 和%m 。其中,%p%显示完成的百分比,这是默认显示方式; %v 显示当前的进度值; %m 显示总的步进值。
  • invertedAppearance:可以使进度条以反方向显示进度。

QProgressDialog 类也有几个重要的属性值,决定了进度条对话框何时出现、出现多长时间。它们分别是 mininum、 maximum 和 minimumDuration。其中, mininum 和 maximum 分别表示进度条的最小值和最大值,决定了进度条的变化范围; minimumDuration 为进度条对话框出现前的等待时间。系统根据所需完成的工作量估算一个预计花费的时间,若大于设定的等待时间(minimumDuration), 则出现进度条对话框;若小于设定的等待时间 (minimumDuration), 则不出现进度条对话框。进度条使用了一个步进值的概念,即一旦设置好进度条的最大值和最小值,进度条将会显示完成的步进值占总的步进值的百分比,百分比的计算公式为:

百分比=(value() -minimum())/ (maximum() -minimum())

main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}


四、总结

进度条会在应用程序开发中经常用到的

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东.'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值