0

我正在创建QProgressDialog如下:

QProgressDialog progressDialog = new QProgressDialog(tr("Calculating..."), NULL, 0, 100, this);
progressDialog->setAutoClose(true);
progressDialog->setValue(0);
progressDialog->setWindowTitle(tr("Calculate Weights"));
progressDialog->setWindowFlags(progressDialog->windowFlags() & ~Qt::WindowCloseButtonHint);
progressDialog->show();

请注意,我使用该Qt::WindowCloseButtonHint标志来禁用“本机关闭按钮”。它似乎在Windows上运行良好,但在OS X上却不行(在OS X上,关闭按钮仍然可用,用户可以关闭QProgressDialog)。

我也用其他标志(例如Qt::WindowSystemMenuHintQt::WindowTransparentForInput)进行了测试,但没有一个能解决我的问题。

当然,我可以使用该Qt::FramelessWindowHint标志来删除“窗口的整个边框”,但这不是我的目标,因为我只想禁用关闭按钮。

我可以使用什么窗口标志来禁用/阻止OS XQProgressBar上的关闭按钮?

4

2 回答 2

1

子类化对话框,并重新实现QCloseEvent.

http://doc.qt.io/qt-5/qcloseevent.html

因为你可以停下来忽略,或者用“你确定”之类的东西来回应。

请参阅http://doc.qt.io/qt-5/qtwidgets-mainwindows-application-example.html#close-event-handler

// in your MyProgressDialog.h
protected:
    void closeEvent(QCloseEvent *event) override;

// In your MyProgressDialog.cpp
void MyProgressDialog::closeEvent(QCloseEvent *event)
{
    //if (maybeSave()) {
    //    writeSettings();
    //    event->accept();
    //} else {
    //    event->ignore();
    //}
    if(event->spontaneous())// this might work, or you can just use an else on the next if statement instead.
        event->ignore();
    else if(m_progress == 100 || m_isDone)
        event->accept();
}

希望有帮助。

于 2017-10-27T14:16:22.350 回答
0

正如@phyatt 所提到的,它是通过使用以下标志组合来解决的:

progressDialog->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint);

在这里回答:Qt hide 最小化、最大化和关闭按钮

于 2017-10-27T15:25:31.830 回答