[英]How to stop/cancel a worker job using the cancel button of a QProgressDialog
[英]Using QProgressDialog properly
我正在使用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);
}
.h文件中的m_progressDialog声明为:
QProgressDialog* m_progressDialog;
因此,发送零值和最大值将创建对话框并进行设置。
我遇到的问题是,如果用户通过单击右上角的十字或使用alt-F4来关闭ProgressDialog窗体,则会发生错误。 据推测这是因为我正在使用Qt :: WA_DeleteOnClose。
我想做的是检测对话框是否已关闭并再次打开,或者提供关闭整个应用程序或继续的操作。
如何测试进度对话框是否已关闭?
还是阻止它关闭?
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
(因为无论如何都会删除对话框),所以我建议您避免设置WA_DeleteOnClose
,而是将对话框存储在QScopedPointer
。 这样,您将能够重用它(无需重新创建),并且在MainWindow
死后将其正确删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.