繁体   English   中英

正确使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM