一、QProgressBar 进度条
1、QProgressBar 类继承自 QWidget,它是一个 QWidget 部件, QProgressBar 除了将其放置
于进度对话框之中外,还可将其放置于窗口的状态栏等其他部件中。
QProgressBar提供了一个水平或垂直的进度条,可以使用setMinimum()和setMaximum指定最小和最大步数。当前的步数是用setValue()设置的。进度条可以用reset()重绕到开头。
2、常用函数
void setMaximum(int maximum) | 设置最大值 |
void setMinimum(int minimum) | 设置最小值 |
void setRange(int minimum,int maximum) | 设置范围,最大、最小值 |
void setValue(int value) | 设置当前值 |
void reset() | 重置 |
void setOrientation(Qt::Orientation) | 设置方向,垂直,水平 |
void setAlignment(Qt::Alignment alignment) | 设置对齐方式,居中,左、右 |
void setTextVisible(bool visible) | 设置进度条文本是香显示 |
void setInvertedAppearance(bool invert) | 设置正、反 |
void setFormat(const QString &format) | 设置文本式显示格式 |
3、QProgressBar类中的属性
①、 alignment: Qt::Alignment
访问函数: Qt::Alignment alignment()const; void setAlignment(Qt::Alignment);
获取和设置进度条的对齐方式
②、 format: QString
访问函数: QString format() const; void setFormat(constQString&); void resetFormat();
设置进度条右侧描述性文字的显示格式,默认为"%p%",具体规定如下:
%p:显示的数值为百分比。
%v:显示的数值为当前设置的值。
%m:显示的数值为进度条的范围值。
示例(各情形见图示):
QProgressBar *pg=new QProgressBar;
pg->setMinimum(100); pg->setMaximum(1100); pg->setValue(800);
③、 invertedAppearance: bool
访问函数: bool invertedAppearance() const; void setInvertedAppearance(bool);
是否反转进度条,若该属性为 true,则进度条会从另一个方向增长(比如从右到左),默
认为 false。
④、 maximum: int 访问函数: int maximum() const; void setMaximum(int);
进度条的最大值。 默认为 100。
⑤、 minimum: int 访问函数: int minimum() const; void setMinimum(int);
进度条的最小值。 默认为 0。
当最小值和最大值都为 0 时,进度条会显示为一个繁忙的状态 (如上图所示)。
若指定的新的当前值超出了进度条的最大或最小值,则对之前设置的当前值没有影响。
若当前值超出了进度条新设置的最大或最小值,则重置进度条(示例见 QPrgressDialog
类)。
⑥、 value: int 访问函数: int value() const; void setValue(int);
信号: valueChanged(int);
获取和设置进度条的当前值,若指定的当前值超出了进度条的最大或最小值,则对之
前设置的当前值没有影响。
⑦、 orientation: Qt::Orientation
访问函数: Qt::Orientation orientation() const; void setOrientation(Qt::Orientation);
进度条的方向,必须是 Qt::Horizontal (水平,默认) 或 Qt::Vertical (垂直)
⑧、 text: const QString 访问函数: virtual QString text() const;
返回进度条右侧的描述性文本,比如返回"50%"等。
⑨、 textDirection: Direction
访问函数: QProgressBar::Direction textDirection()const;void setTextDirection(QProgressBar::Direction);
描述垂直进度条描述性文字的阅读方向,该属于对水平进度条无影响。默认为
QProgressBar::TopToBottom (从上到下)
⑩、 textVisible: bool 访问函数: bool isTextVisible() const; void setTextVisible(bool);
描述是否显示进度条的描述性文字(通常显示为百分比),默认为 true。该属性可能会被
样式忽略。
4、 QProgressBar类中的函数
①、 QProgressBar(QWidget* parent = Q_NULLPTR); //构造函数
②、 void reset(); //槽,重置进度条
③、 void setRange(int min, int max); //槽,设置进度条的范围(即最小值和最大值)。
④、 void valueChanged(int value); //信号
当进度条中显示的值发生变化时发送此信号, value 为进度条显示的新值。
//1.正向显示
pProgressBar = new QProgressBar(this);
pProgressBar->move(50, 100);
pProgressBar->setOrientation(Qt::Horizontal); // 水平方向
pProgressBar->setMinimum(0); // 最小值
pProgressBar->setMaximum(100); // 最大值
pProgressBar->setValue(50); // 当前进度
//2.反方向显示
pProgressBar2 = new QProgressBar(this);
pProgressBar2->move(200, 100);
pProgressBar2->setOrientation(Qt::Horizontal); // 水平方向
pProgressBar2->setMinimum(0); // 最小值
pProgressBar2->setMaximum(100); // 最大值
pProgressBar2->setValue(50); // 当前进度
pProgressBar2->setInvertedAppearance(true); // 反方向
//3.百分比
pProgressBar3 = new QProgressBar(this);
pProgressBar3->move(100, 150);
pProgressBar3->setOrientation(Qt::Horizontal); // 水平方向
pProgressBar3->setMinimum(0); // 最小值
pProgressBar3->setMaximum(4800); // 最大值
pProgressBar3->setValue(2000); // 当前进度
double dProgress = (pProgressBar3->value() - pProgressBar3->minimum()) * 100.0
/ (pProgressBar3->maximum() - pProgressBar3->minimum());
//fromLocal8Bit:它将一个本地编码的QByteArray对象转换为一个QString对象
//QString::number(dProgress, 'f', 1):显示fload类型,保留1位小数。将替换掉前方的 %1
pProgressBar3->setFormat(QString::fromLocal8Bit("当前进度为:%1%").arg(QString::number(dProgress, 'f', 1)));
pProgressBar3->setAlignment(Qt::AlignRight | Qt::AlignVCenter); // 对齐方式
//4.如果最小值和最大值都设置为0,进度条会显示了一个 繁忙指示
pProgressBar4 = new QProgressBar(this);
pProgressBar4->move(100, 200);
pProgressBar4->setOrientation(Qt::Horizontal); // 水平方向
pProgressBar4->setMinimum(0); // 最小值
pProgressBar4->setMaximum(0); // 最大值
//5. 进度条对话框
progressDlg = new QProgressDialog;
//progressDlg->setWindowModality(Qt::WindowModal);
progressDlg->setMinimumDuration(0);//dialog出现需等待的时间
progressDlg->setWindowTitle("Please Wait...");//
progressDlg->setAutoClose(0); //当进度条显示到 100%时 不隐藏
progressDlg->setAutoReset(0); //当进度条显示到 100%时 不调用reset()函数重置进度条
progressDlg->setLabelText("Copying...");//设置进度对话框标签文本,向用户提示该进度条正在做什么
progressDlg->setCancelButtonText("Cancel");//重新设置 Cancel按钮 的文本
progressDlg->setRange(0, 100);
for (int i = 0;i <= 100;i += 1) {
progressDlg->setValue(i);
}
二、进度对话框 QProgressDialog
1、进度对话框主要用于向用户反应当前操作进度的对话框(见右图),
该对话框也是 Qt 预定义的标准对话框。
2、进度对话框包含一个进度条(QProgressBar),以及其他一些相关
的子部件。
3、 Qt 实现的进 度对话框的原理及执行过程
①、 QProgressDialog 的构造函数,会启动一个默认为 4000 毫秒的计时器,当计时器超时
时,会显示该进度对话框,也就是说只要创建了 QProgressDialog 对象,即使程序中没
有显示该对话框的 show()语句(或类似语句),该对话框 4 秒之后仍会被显示出来。因
此使用进度对话框时,不需要显示的调用 show()语句(或类似语句)显示该对话框,程
序会在超时之后自动显示。
②、重置计时器: QProgressDialog::setValue()函数可以重新启动计时器,其规则如下:
需使用 0 或 QProgressDialog::minmum()调用 setValue()函数。
此时使用 setMinimumDuration()函数设置的时间才能作为计时器的超时时间,也
就是说该函数此时才起作用,否则该函数不起作用。
setMinimumDuration()函数后,必须紧跟一个setValue(0) 才能起作用!
示例:
QProgressDialog *pp = new QProgressDialog;
pp->setMinimumDuration(10000); //使对话框在 10 秒之后显示
pp->setValur(0); //必须使用此步骤,否则 setMinimumDuration()函数设置的值将不起作用。
//不需使用 pp->show()或类似语句来显示对话框 pp。
以上程序会在 10 秒之后自动显示一个进度为 0%的进度对话框。
③、若进度对话框的完成时间比超时时间更短,则进度对话框不会被显示。比如
QProgressDialog *pp = new QProgressDialog;
for(int i=0; i<1001;i++) pp->setValue(i*100/1000); //对话框不会显示,很明显计算机计算 1001 次循环
不需要 4 秒时间,因此最终该对话框未被显示出来。
4、进度对话框的一些其他规则
①、基本规则:进度对话框在操作完成时(即当前值等于最大值或显示为 100%时),默认
会自动重置并且隐藏对话框。隐藏和重置由 autoClose 和 autoReset 属性控制(详见下
文)
②、若指定的新的当前值超出了进度条的最大或最小值,则对之前设置的当前值没有影响。
若当前值超出了进度条新设置的最大或最小值,则重置进度条。 这两条规则对设置最
大最小值和当前值的顺序作了规定,不同顺序会产生不同影响。
示例:
QProgressDialog *pp = new QProgressDialog; pp->setValue(80); | //默认最小值为 0,最大值为 100。 |
pp->setValue(222); //当前值仍为 80。
pp->setMaximum(40); //当前值 80 大于新设置的最大值 40,重置进度条为 0。
③、 若重新设置最大值为当前值,则进度对话框不会被隐藏。此规则规定了设置最大值应
在设置当前值之前。
④、 若进度条的最大和最小值都设置为 0,则进度条不再显示百分比,而会指示一个繁忙
的状态,见下图。
5、下图为 Qt 对进度对话框外观进行的描述
6、 QProgressDialog 类中的属性
①、 autoClose: bool 访问函数: bool autoClose() const; void setAutoClose(bool);
指示 reset()函数是否隐藏对话框,若 autoClose()为 true,则 reset()函数会隐藏对话框,
若为 flase 则不会隐藏对话框,默认为 true。
②、 autoReset: bool 访问函数: bool autoReset() const; void setAutoReset(bool);
进度对话框是否在value()等于maximum时立即调用reset(),若为true则立即调用reset()
函数,若为 false 则不调用 reset()函数。默认为 true。
以上两属性可对进度对话框实现如下操作
autoClose = false; autoReset = true; 不隐藏但重置对话框
autoClose = false; autoReset = false; 既不隐藏也不重置对话框
autoClose = true; autoReset = false; 因为未调用 reset()函数,所以既不重置也不
隐藏对话框。也就是说不能设置为既隐藏对话框而又不重置对话框。
autoClose = true; autoReset = true; 隐藏且重置对话框。
③、 labelText: QString 访问函数: QString labelText() const; void setLlabelText(const QString&);
获取和设置进度对话框的标签文本。默认为空字符串。
④、 maximum: int 访问函数: int maximum() const; void setMaximum(int);
获取和设置进度条所表示的最大值。默认为 100。
⑤、 minimum: int 访问函数: int minimum() const; void setMinimum(int);
获取和设置进度条所表示的最小值。默认为 0。
⑥、 value: int 访问函数: int value() const; void setValue(int);
获取和设置进度对话框的当前值。注意:若进度对话框是模态的,则 setValue()调用
QApplication::processEvents(),因此不要在 paintEvent()函数中使用进度对话框。
⑦、 wasCanceled: const bool 访问函数: bool wasCanceled() const;
若进度对话框已被取消则为 1,否则为 0。若该属性为 1,则直到进度对话框被重置(即
调用 reset()函数)为止都会一直为 1。
注意:关闭进度对话框后,此属性值为1;重新显示后,此属性为0
⑧、 minimumDuration: int 访问函数: int minimumDuration() const;
void setMinimumDuration(int );
显示进度对话框之前需经过的时间, 若为 0,则会立即显示进度对话框,默认为 4000。
7、 QProgressDialog 类中的函数
①、 QProgressDialog(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QProgressDialog(const QString &labelText, const QString &cancelButtonText, int min,
int max, QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
以上为构造函数,各参数意 义如下:
labelText:进度对话框的标签文本。
cancelButtonText:取消按钮文本,若该参数为 QString()(注意:不是空字符串),则不
显示取消按钮。
min 和 max 分别表示进度条的最小和最大值。
②、 void open(QObject* receiver, const char* member);
显示进度对话框,并把 canceled()信号连接到由 receiver 和 member 指定的槽,关闭对
话框时,信号和槽将被断开。
③、 void cancel(); //槽
隐藏并重置进度对话框,且设置 wasCanceled 属性为 1。
④、 void reset(); //槽
重置进度对话框,若 autoClose 属性为 true,则进度对话框会隐藏,若该属性为 false,
则不会隐藏进度对话框。 注意:该函数会把 wasCancel 属性重置为 false。
⑤、 void setRange(int min, int max); //槽
设置进度条的范围(即最小值和最大值)。
⑥、 void setBar(QProgressBar* bar);
把进度对话框的进度条设置为 bar,注意:进度对话框会获取进度条 bar 的所有权,在
必要时会删除进度条,因此不要使用在栈上分配的进度条。
⑦、 void setLabel(QLabel* label);
把进度对话框的标签设置为 label。注意:进度对话框会获取 label 的所有权,在必要
时会将其删除,因此不要在栈上分配 label。
⑧、 void setCancelButton(QPushButton* cancelButton);
把进度对话框的取消按钮设置为 cancelButton,若设置为 0,则不会显示取消按钮。注
意:进度对话框会获取 cancelButton 的所有权,在必要时会将其删除,因此不要使用
在栈上分配的按钮。
⑨、 void setCancelButtonText(const QString &cancelButtonText); //槽
把取消按钮的文本设置为 cancelButtonText,若设置为 QString()(注意:不是空字符串),
则删除取消按钮。
⑩、 void forceShow(); //槽,受保护的
QProgressDialog 的构造函数使用此函数显示进度对话框, 注意:该函数不是虚拟的,
因此重写该函数并不能改变构造函数的默认行为。
⑪、 void canceled(); //信号
当点击 Cancel 按钮时发送此信号,此信号默认连接到 QProgressDialog::cancel()槽函数