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


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


    前言

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


    一、进度条概述

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

    二、效果实例

    图一

    在这里插入图片描述

    三、原码解析

    dialog.h

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    dialog.cpp

    #include "dialog.h"
    #include 
    #include 
    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;
                }
          }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    其中,
    (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())
    
    • 1

    main.cpp

    #include "dialog.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog w;
        w.show();
    
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    四、总结

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

  • 相关阅读:
    第9章:项目实战
    Windows11 家庭版开启远程桌面解决方案之RDP Wrapper Library,小白全面攻略
    信息论学习笔记(一):认识通信系统
    【mindspore】【训练警告】执行训练代码时存在的警告
    OpenCV 07(图像滤波器)
    YOLOv5_Android_USBCamera:支持USB摄像头的YOLOv5Android图像识别项目
    【力扣每日一题】2023.9.15 宝石补给
    java 常用正则表达式记录
    jQuery多库共存问题解决方法
    vulnhub DOUBLETROUBLE: 1靶机
  • 原文地址:https://blog.csdn.net/weixin_44759598/article/details/126671433