【发布时间】:2013-07-03 02:10:26
【问题描述】:
我正在使用 Qt 开发应用程序。我不知道哪个槽对应于“用户单击窗口框架的'X'(关闭)按钮”的事件,即这个按钮:
如果没有这个插槽,谁能给我一些其他方法,我可以在用户按下关闭按钮后启动一个功能。
【问题讨论】:
我正在使用 Qt 开发应用程序。我不知道哪个槽对应于“用户单击窗口框架的'X'(关闭)按钮”的事件,即这个按钮:
如果没有这个插槽,谁能给我一些其他方法,我可以在用户按下关闭按钮后启动一个功能。
【问题讨论】:
如果您有 QMainWindow,则可以覆盖 closeEvent 方法。
#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
{
QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
tr("Are you sure?\n"),
QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
QMessageBox::Yes);
if (resBtn != QMessageBox::Yes) {
event->ignore();
} else {
event->accept();
}
}
如果您要继承 QDialog,closeEvent 将不会被调用,因此您必须覆盖 reject():
void MyDialog::reject()
{
QMessageBox::StandardButton resBtn = QMessageBox::Yes;
if (changes) {
resBtn = QMessageBox::question( this, APP_NAME,
tr("Are you sure?\n"),
QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
QMessageBox::Yes);
}
if (resBtn == QMessageBox::Yes) {
QDialog::reject();
}
}
【讨论】:
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp())); 应该可以工作。请参阅下面塞巴斯蒂安的回答。
setAttribute(Qt::WA_QuitOnClose);。
closeEvent吗?它对我有用,QCloseEvent 的文档说 事件处理程序 QWidget::closeEvent() 接收关闭事件 并且 QDialog 也是一个小部件,对吗?或者它是否与旧的 Qt 版本(
closeEvent,但如果用户按下键盘上的 Esc,QDialog 会在不调用 @ 的情况下关闭987654333@.
嗯,我明白了。一种方法是覆盖类定义中的QWidget::closeEvent(QCloseEvent *event) 方法并将代码添加到该函数中。示例:
class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};
void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}
【讨论】:
您可以将 SLOT 附加到
void aboutToQuit();
您的 QApplication 的信号。此信号应在应用关闭前发出。
【讨论】:
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
你也可以重新实现受保护的成员 QWidget::closeEvent()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}
【讨论】: