我正在创建一个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::WindowSystemMenuHint
,Qt::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();
}
希望有帮助。
如@phyatt所述,它是通过使用以下标志组合来解决的:
progressDialog->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint);
正如这里回答的那样:Qt隐藏最小化,最大化和关闭按钮