目录
【1】采用QProgressBar进度条横向或纵向显示进度
【2】采用QProgressDialog进度条对话框的方式显示进度(这是一种针对慢速过程的进度表示方式,文件数目1000都太小,不进行计算)
实例:模拟文件复制的进度
新建:Qt Widgets Application
项目名称:Progress
类名:ProgressDlg
基类:QDialog
不选择“创建界面”
代码及详细注释如下:
【main.cpp】
#include "progressdlg.h" //使用哪个类就必须把包含该类的头文件引用过来(*.h文件中包含了相应类的定义)
#include <QApplication> //每个使用[Qt图形化应用程序]中都必须使用一个QApplication对象
//QApplication管理各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等
int main(int argc, char *argv[]) //这里是应用程序的入口。几乎所有使用Qt的情况下,main()函数只需在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。
//所有Qt程序必须有且只有一个main()函数。argc是命令行变量的数量,argv是命令行变量的数组。
{
QApplication a(argc, argv); // a是创建的QApplication类的对象,用来处理命令行变量。所有被Qt识别的命令行参数都将从argv中移去,argc也因此减少
ProgressDlg w; //创建ProgressDlg类的对象(包含该类头文件)
w.show(); //窗口部件可见
return a.exec(); //main()函数将控制权交给Qt,Qt完成事件处理工作,当应用程序退出的时候,exec()函数的值就会返回。
//exec()函数中,Qt接收并处理用户和系统的事件,并且将他们传递给适当的窗口部件。
}
【progressdlg.cpp】
#include "progressdlg.h"
#include <QFont>
#include <QProgressDialog>
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("10000"));
ProgressType = new QLabel;
ProgressType->setText(tr("显示类型:"));
comboBox = new QComboBox;
comboBox->addItem(tr("ProgressBar"));
comboBox->addItem(tr("ProgressDialog"));
progressBar = new QProgressBar;
startBtn = new QPushButton;
startBtn->setText(tr("开始"));
//网格布局
mainLayout = new QGridLayout(this); //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(startBtn,3,1);
mainLayout->setMargin(15); //边距:控件与窗体边之间的距离
mainLayout->setSpacing(10); //间距:各控件之间的距离
//事件关联
connect(startBtn,SIGNAL(clicked()),this,SLOT(startProgress()));
}
ProgressDlg::~ProgressDlg()
{
}
void ProgressDlg::startProgress()
{
bool ok;
int num = FileNumLineEdit->text().toInt(&ok); //模拟复制文件的过程:取文件的数目
if(comboBox->currentIndex()==0) //【1】采用QProgressBar进度条横向或纵向显示进度
{
progressBar->setRange(0,num); //进度条的步进范围
for(int i=1;i<num+1;i++)
{
progressBar->setValue(i); //进度条总的步进值 ++
}
}
else if(comboBox->currentIndex()==1) //【2】采用QProgressDialog进度条对话框的方式显示进度(这是一种针对慢速过程的进度表示方式,文件数目1000都太小,不进行计算)
{
QProgressDialog *progressDialog = new QProgressDialog(this);//this
QFont font("ZYSong18030",12);
progressDialog->setFont(font);
progressDialog->setWindowModality(Qt::WindowModal); //进度对话框采用【模态方式】进行显示(在显示进度的同时,其他窗口不响应输入信号)
progressDialog->setMinimumDuration(5); //进度对话框出现前需等待的时间为5秒。
//系统根据所需完成的工作量估算一个预计花费的时间,若大于设定的等待时间,则出现进度条对话框;若小于设定的等待时间,则不出现进度条对话框。
progressDialog->setWindowTitle(tr("Plz wait")); //进度对话框的窗体标题
progressDialog->setLabelText(tr("Copying...")); //进度对话框的显示文字信息
progressDialog->setCancelButtonText(tr("Cancle")); //进度对话框的取消按钮的显示文字
progressDialog->setRange(0,num); //进度条的步进范围
for(int i=1;i<num+1;i++)
{
progressDialog->setValue(i); //进度条总的步进值 ++
if(progressDialog->wasCanceled()) //若取消被触发,则退出循环并关闭进度对话框
return;
}
}
}
【progressdlg.h】
#ifndef PROGRESSDLG_H
#define PROGRESSDLG_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QProgressBar>
#include <QPushButton>
#include <QGridLayout>
class ProgressDlg : public QDialog //ProgressDlg类继承自QDialog类
{
Q_OBJECT //Q_OBJECT是个宏。作用是启动Qt5元对象系统的一些特性(如支持信号和槽等)。它必须放在类定义的私有区中。
public:
ProgressDlg(QWidget *parent = 0);//构造函数:主要完成主界面的初始化,包括各控件的创建、布局、信号/槽的连接
~ProgressDlg(); //析构函数
private:
QLabel *FileNum;
QLineEdit *FileNumLineEdit;
QLabel *ProgressType;
QComboBox *comboBox;
QProgressBar *progressBar;
QPushButton *startBtn;
QGridLayout *mainLayout;
private slots:
void startProgress();
};
#endif // PROGRESSDLG_H