正确使用QProgressDialog
Using QProgressDialog properly
本文关键字:QProgressDialog 更新时间:2023-10-16
我使用QProgressDialog在QTreeView中显示从数据库加载数据的进度。我使用信号和插槽来发送记录的数量和当前记录。这是插槽代码:
void MainWindow::loadDataUpdate(int value, int max)
{
if ((max > 0) && (value == 0))
{
m_progressDialog = new QProgressDialog("Warming up - please wait ... ", "Cancel", value, max , this);
m_progressDialog->setMinimumDuration(2);
m_progressDialog->setWindowModality(Qt::WindowModal);
m_progressDialog->setAttribute(Qt::WA_DeleteOnClose);
m_progressDialog->setCancelButton(0);
m_progressDialog->setWindowTitle( this->windowTitle() );
}
if ((value == max) && (max > 0) )
{
m_progressDialog->setValue(m_progressDialog->maximum());
return;
}
m_progressDialog->setValue(value);
}
m_progressDialog在.h文件中声明为:
QProgressDialog* m_progressDialog;
因此,发送一个零值和一个最大值会创建对话框并进行设置。
我遇到的问题是,如果用户通过单击右上角的十字或使用alt-F4关闭ProgressDialog表单,就会发生错误。这可能是因为我正在使用Qt::WA_DeleteClose。
我想做的是检测对话框是否已关闭并再次打开,或者关闭整个应用程序或继续。
如何测试进度对话框是否已关闭?
还是阻止它关闭?
QProgressDialog
为此提供cancelled
信号。你可以连接到它,或者显示对话框,或者做任何你想做的事情
所以你需要做的是创建一个合适的插槽,并将其连接到信号:
connect(m_progressDialog, &QProgressDialog::canceled, this, &MainWindow::onDialogCanceledSlot);
<..>
//add a slot to your window class:
class MainWindow
{
public slots:
void onDialogCanceledSlot()
{
m_progressDialog->show();//for example.
}
}
如果你只是想把它显示出来,你可以使用lambda:
connect(m_progressDialog, &QProgressDialog::canceled, [&](){
m_progressDialog->show();
});
请注意,在使用WA_DeleteOnClose
时仍然无法做到这一点(因为对话框无论如何都会被删除),因此我建议您避免设置WA_DeleteOnClose
,而是将对话框存储在QScopedPointer
中。通过这种方式,您将能够重用它(无需重新创建),并且当您的MainWindow
失效时,它将被正确删除。
相关文章:
- 如何在QT中制作模态QProgressDialog?
- Modal QprogressDialog从Worker线程更新
- 如何在OS X上阻止QProgressDialog的'native close button'?
- 模态qprogressdialog :: setValue()导致嵌套事件循环崩溃
- qprogressdialog未显示文本标签
- 如何将QProgressDialog与QDomDocument保存功能一起使用
- QProgressDialog栏在完成时重置为零
- QProgressDialog "closes" 当另一个进程启动时
- QProgressDialog:关于MinimumDuration的问题
- 正确使用QProgressDialog
- 如果没有显示QProgressDialog, QtConcurrent::map会崩溃
- QProgressDialog在暂停时没有绘制