【问题标题】:How to block the 'native close button' of a QProgressDialog on OS X?如何在 OS X 上阻止 QProgressDialog 的“本机关闭按钮”?
【发布时间】:2018-04-09 02:29:07
【问题描述】:

我正在创建一个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 上,关闭按钮仍然可用,用户可以关闭 @ 987654325@)。

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

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

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

【问题讨论】:

标签: c++ qt qprogressdialog


【解决方案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();
}

希望对您有所帮助。

【讨论】:

  • 非常感谢@phyatt,这似乎是一个很好的解决方案,但我正在寻找一个更简单的解决方案,也许使用 window flags。如果在 OS X 上不可能,我可能会按照您的提示创建QProgressDialog 的子类。
  • 可以使用窗口标志 (doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html) 和小部件属性 (doc.qt.io/qt-5/qt.html#WidgetAttribute-enum) 进行大量自定义,但是当您开始做一些极端情况时,您可以使用标准子类化进行几乎无限的自定义路线。
  • 不,我之前没有发现这个问题。效果很好,非常感谢@phyatt。
【解决方案2】:

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

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

在这里回答:Qt hide minimize, maximize and close buttons

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多