正确使用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失效时,它将被正确删除。