Как заблокировать "родную кнопку закрытия" QProgressDialog на OS X?

Я создаю 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 XOS X кнопка закрытия все еще доступна, и пользователь может закрыть QProgressDialog).

Я также проверил с другими флагами (например, Qt::WindowSystemMenuHint, Qt::WindowTransparentForInput) но никто не решил мою проблему.

Конечно, я могу использовать Qt::FramelessWindowHint флаг, чтобы удалить "всю границу окна", но это не моя цель, так как я просто хочу отключить кнопку закрытия.

Какой флаг окна я могу использовать, чтобы отключить / заблокировать QProgressBar кнопка закрытия на OS X?

2 ответа

Подкласс диалогового окна и повторно реализовать QCloseEvent,

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

В этом вы можете остановиться и проигнорировать, или ответить "вы уверены".

См. http://doc.qt.io/qt-5/qtwidgets-mainwindows-application-example.html.

// 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();
}

Надеюсь, это поможет.

Как упомянуто @phyatt, это было решено с помощью следующей комбинации флагов:

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

Как здесь ответили: Qt скрыть кнопки сворачивания, сворачивания и закрытия

Другие вопросы по тегам