使用QProgressDialog来展示当前任务执行进度
QProgressDialog 默认会在进度达到设定的最大值时自动关闭。
setAutoReset()设置为false或setAutoClose()设置为false时对话框无法自动关闭。
功能设计
- 任务未完成时,不允许其他操作,对话框设置为模态阻塞其他界面
- 设置进度条range为0-100,在任务执行过程中通过setValue改变进度条的当前值
- 隐藏cancel按钮
- 设置进度对话框不在任务栏显示
- 屏蔽键盘esc键会退出对话框的功能
- 通过setLabelText设置不同阶段的显示文本
实现代码
class CProgressDialog : public QProgressDialog
{
public:
CProgressDialog(QDialog *parent = nullptr):
QProgressDialog(parent)
{
setWindowFlag(Qt::Tool); // 设置此属性使对话框不在任务栏显示
setRange(0, 100); // 设置进度范围
setCancelButton(nullptr); // 隐藏取消按钮
// setAttribute(Qt::WA_DeleteOnClose);
setModal(true); // 设置对话框为模态
}
// 重写关闭事件
void closeEvent(QCloseEvent *event)
{
// 进度达到最大值时才允许对话框关闭
if (value() == 100)
event->accept();
else
event->ignore();
}
// 重写键盘事件
void keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
// 按下esc时,调用close()来触发关闭事件
case Qt::Key_Escape:
this->close();
break;
default:
QProgressDialog::keyPressEvent(event);
}
}
};
使用方法
CProgressDialog *progress = new CProgressDialog;
progress->setLabelText(tr("Progress"));
progress->show();