c++ - 如何在 OS X 上阻止 QProgressDialog 的 'native close button'?

标签 c++ qt qprogressdialog

我正在创建一个 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 标志来禁用“ native 关闭按钮”。它似乎在 Windows 上运行良好,但在 OS X 上运行不佳(在 OS X 上,关闭按钮仍然可用,用户可以关闭 QProgressDialog).

我还测试了其他标志(例如 Qt::WindowSystemMenuHintQt::WindowTransparentForInput),但都没有解决我的问题。

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

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

最佳答案

子类化对话框,并重新实现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();
}

希望对您有所帮助。

关于c++ - 如何在 OS X 上阻止 QProgressDialog 的 'native close button'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46975792/

相关文章:

c++ - 删除引用时双重释放或损坏

c++ - 需要帮助了解递归前缀计算器

qt - 将 QList<int> 保存到 QSettings

c++ - 如何在 QT 中制作模态 QProgressDialog?

c++ - Modal QProgressDialog::setValue() 导致嵌套事件循环崩溃

c++ - Qt 5- QTextEdit 恢复为默认字体

c++ - 为什么不能将函数中变量的最后一次赋值视为移动?

c++ - Mac OS X 10.7.4 在 Qt 应用程序中安装帮助工具

c++ - 继承QTime,自定义时间格式