目录
一、设计需求
二、实现代码
三、代码解析
四、总结
五、扩展(自定义QProgressBar样式)
一、设计需求
在很多应用程序中,在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景,如:拷贝操作、安装操作以及卸载操作。本例要求实现进度条简单使用,同时实现模态与非模态的两种方式。
二、实现代码
#include "progressdlg.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ProgressDlg w;
w.show();
return a.exec();
}
#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
#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("1000000"));
//选择显示方式
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()));
}
ProgressDlg::~ProgressDlg()
{
}
void ProgressDlg::startProgress()
{
bool ok;
//获取当前需要复制的文件数目,这里对应进度条的总步进值
int num =FileNumLineEdit->text().toInt(&ok);
if(comboBox->currentIndex()==0) //ProgressBar
{
progressBar->setRange(0,num);
for(int i=1;i<num+1;i++)
{
//QProgressBar的使用
progressBar->setValue(i);
}
}
else if(comboBox->currentIndex()==1) //ProgressDialog
{
//新建一个QProgressDialog对象
QProgressDialog *progressDialog=new QProgressDialog(this);
QFont font("ZYSong18030",12);
progressDialog->setFont(font);
//设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号
progressDialog->setWindowModality(Qt::ApplicationModal);
//设置进度对话框出现需等待的时间,此处设定为 5 秒,默认为 4 秒
progressDialog->setMinimumDuration(5);
progressDialog->setWindowTitle(tr("Please Wait"));
progressDialog->setLabelText(tr("Copying..."));
progressDialog->setCancelButtonText(tr("Cancel"));
//设置进度对话框的步进范围
//注意:当num为0时,如果进度条的值设置为0,此时进度条的状态时不稳定的,有时为空,有时为满。
//因为此时的0即为最小值也为最大值
progressDialog->setRange(0,num);
for(int i=1;i<num+1;i++)
{
progressDialog->setValue(i);
//检测 "取消”按钮是否被触发,若触发则退出循环并关闭进度对话框
if(progressDialog->wasCanceled())
return;
}
}
}
效果展示:
三、代码解析
(1)setWindowModality函数
QWidget类中的setWindowModality()函数是用于设置窗口模态性的方法,可以用来控制窗口对于其他窗口的阻塞程度。
窗口模态性指的是窗口能否被其他窗口遮盖。在Qt中,有三种窗口模态性模式:
Qt::NonModal:非模态窗口,不会阻塞其他窗口。
Qt::WindowModal:应用程序模态窗口,阻塞其所属应用程序中的其他窗口,但允许与其他应用程序的窗口进行交互。
Qt::ApplicationModal:系统模态窗口,阻塞其所属应用程序中的所有窗口,包括与其他应用程序的窗口之间的交互。
setWindowModality()函数的用法如下:
void QWidget::setWindowModality(Qt::WindowModality windowModality)
其中,windowModality是一个枚举类型,可以设置为Qt::NonModal、Qt::WindowModal或Qt::ApplicationModal中的任意一个值。
例如,将一个对话框设置为应用程序模态窗口可以这样做:
QDialog *dialog = new QDialog();
dialog->setWindowModality(Qt::WindowModal);
dialog->exec();
在上述代码中,QDialog对象dialog被设置为应用程序模态窗口,即在其打开状态下,所属应用程序中的其他窗口被阻塞,但它可以与其他应用程序的窗口进行交互。exec()函数用于显示对话框并进入模态运行,直到对话框被关闭。
需要注意的是,如果将一个窗口设置为模态窗口,则该窗口在显示期间将会阻塞其他事件的处理,包括其他窗口的事件,直到该模态窗口被关闭。因此,在设置窗口模态性时,应当谨慎使用,以免影响用户的操作体验。
四、总结
QProgressBar使用方法基本上就是上述的方法。但是用户可以自定义进度条的样式,来实现更加优秀的进度框。
五、扩展(自定义QProgressBar样式)
在Qt中,可以使用样式表(StyleSheet)来自定义QProgressBar的外观。QProgressBar有几个重要的样式属性可以用来自定义其外观:
background-color:进度条的背景颜色。
color:进度条的前景颜色(即进度条已完成部分的颜色)。
selection-background-color:进度条的选中(已完成)部分的背景颜色。
border-color:进度条的边框颜色。
border-width:进度条的边框宽度。
以下是一个用样式表自定义QProgressBar外观的示例:
QProgressBar {
background-color: pink;
border: 1px solid black;
border-radius: 5px;
height: 20px;
}
QProgressBar::chunk {
background-color: green;
width: 20px;
margin: 1px;
}
在上述示例中,QProgressBar的背景颜色被设置为粉色,边框为黑色,圆角半径为5px,高度为20px。QProgressBar::chunk指定了进度条的前景颜色为绿色,宽度为20px,外边距为1px。
效果展示:
可以根据需要自定义更多的样式属性,以实现不同的进度条样式。另外,可以使用颜色、背景图片或渐变等高级特性来进一步定制进度条的外观。使用样式表自定义QProgressBar的方法与其他Qt部件类似。只需将样式表应用到QProgressBar上即可。