一、前言
QProgressDialog类继承于QDialog,是Qt设计用来反馈进度的对话框。
对话框QDialog
QProgressDialog提供了一个进度条,表示当前程序的某操作的执行进度,让用户知道操作依旧在激活状态,配合按钮,用户就可以随时终止操作,并且进度条、标签、按钮都可以自定义。其他属性比如最大值、最小值、步长、当前值等的操作和QProgressBar相同。
QProgressDialog在不知道何时显示进度条的情况下提供了解决方案,比如在操作硬件的时时候,在不同系统消耗的时间不同,它提供了minimumDuration属性,在超过minimumDuration之后才显示进度条。
QProgressDialog progress("Copying files...", "Abort Copy", 0, 100, this);
progress.setWindowModality(Qt::WindowModal);
progress.setWindowTitle("QProgressDialog");
progress.open(this,SLOT(onMessageBoxFinish()));
progress.setValue(20);
progress.exec();
二、QProgressDialog类
1、autoClose
该属性表示是否使用reset()会自动隐藏进度条,默认为false。
bool autoClose() const
void setAutoClose(bool close)
2、autoReset
该属性表示是否在当前值value等于最大值maximum的时候调用reset(),默认为true。
bool autoReset() const
void setAutoReset(bool reset)
3、labelText
该属性表示标签的文本,默认为空字符串。
QString labelText() const
void setLabelText(const QString &text)
4、maximum
该属性表示进度条可设的最大值,默认值为100。
int maximum() const
void setMaximum(int maximum)
5、minimum
该属性表示进度条可设的最小值,默认值为0。
int minimum() const
void setMinimum(int minimum)
6、minimumDuration
该属性保存对话框出现之前必须经过的时间,如果任务的预期持续时间小于该值,则不会出现对话框。这可以防止为快速结束的任务弹出对话框。如果设置为0,则只要设置了任何进度,对话框就会立即显示。默认值为4000毫秒。
int minimumDuration() const
void setMinimumDuration(int ms)
7、value
该属性表示当前进度条的值,该值要不小于最小值minimum,不大于maximum。
int value() const
void setValue(int progress)
8、wasCanceled
该属性表示对话框是否被取消。
bool wasCanceled() const
配合模式对话框使用,在setValue()的时候判断对话框是否取消。
QProgressDialog progress("Copying files...", "Abort Copy", 0, numFiles, this);
progress.setWindowModality(Qt::WindowModal);
for (int i = 0; i < numFiles; i++) {
progress.setValue(i);
if (progress.wasCanceled())
break;
//... copy one file
}
progress.setValue(numFiles);
9、公共函数
1)open
打开对话框并将其canceled()信号连接到接收器和成员指定的插槽。如果槽函数的第一个参数有一个指针,则连接到buttonClicked(),否则连接到finished(),当对话框关闭的时候,这个信号槽连接会被断开。
void open(QObject *receiver, const char *member)
实例:打开对话框的同时绑定信号canceled与槽函数onQProgressDialogCanceled,对话框关闭取消信息。
public slots:
void onQProgressDialogCanceled();
void MainWindow::onQProgressDialogCanceled()
{
qDebug()<<"QProgressDialog Finish";
}
QProgressDialog progress("Copying files...", "Abort Copy", 0, 100, this);
progress.setWindowModality(Qt::WindowModal);
progress.setWindowTitle("QProgressDialog");
progress.open(this,SLOT(onQProgressDialogCanceled()));
progress.setValue(20);
progress.exec();
2)setBar
自定义进度条,进度对话框会自动调整大小。进度对话框拥有将在必要时删除的进度条,因此不要使用在堆栈上分配的进度条。
void setBar(QProgressBar *bar)
3)setCancelButton
自定义取消按钮,进度对话框拥有这个按钮的所有权,它将在必要时被删除,所以不要传递堆栈上对象的地址。
void setCancelButton(QPushButton *cancelButton)
4)setLabel
自定义标签,进度对话框会自动调整大小。标签归进度对话框所有,必要时将被删除,因此不要在堆栈上传递对象的地址。
void setLabel(QLabel *label)
10、公共槽函数
1)cancel
取消操作,会产生重置进度对话框,wasCanceled()变为true,直到进度对话框被重置,进度对话框隐藏。
void cancel()
2)reset
重置进度对话框,如果autoClose设置为true,那么进度条会被隐藏。
void reset()
3)setCancelButtonText
设置取消按钮上面的文本。
void setCancelButtonText(const QString &cancelButtonText)
4)setRange
等同于setMinimum和setMinimumDuration。
void setRange(int minimum, int maximum)
11、信号
1)canceled
取消按钮被点击时触发。
void canceled()
示例:定时器循环对进度条赋值,当到达最大值的时候或者取消按钮被按下的时候结束定时器。
// Operation constructor
Operation::Operation(QObject *parent)
: QObject(parent), steps(0)
{
pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100);
connect(pd, &QProgressDialog::canceled, this, &Operation::cancel);
t = new QTimer(this);
connect(t, &QTimer::timeout, this, &Operation::perform);
t->start(0);
}
void Operation::perform()
{
pd->setValue(steps);
//... perform one percent of the operation
steps++;
if (steps > pd->maximum())
t->stop();
}
void Operation::cancel()
{
t->stop();
//... cleanup
}