在 Qt 中,与用户单击窗口框架的“ X”(关闭)按钮相对应的槽是什么,即这个按钮:
如果没有插槽,用户按下关闭按钮后是否有其他方法触发函数?
我知道了。一种方法是重写类定义中的 QWidget::closeEvent(QCloseEvent *event)方法,并将代码添加到该函数中。例如:
QWidget::closeEvent
(QCloseEvent *event)
class foo : public QMainWindow { Q_OBJECT private: void closeEvent(QCloseEvent *bar); // ... }; void foo::closeEvent(QCloseEvent *bar) { // Do something bar->accept(); }
如果有 QMainWindow,则可以重写 closeEvent方法。
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():
QDialog
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(); } }
可以将槽附加到
void aboutToQuit();
这个信号应该在应用程序关闭之前发出。
也可以重新实现受保护的成员 QWidget: : closeEvent ()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event) { // do what you need here // then call parent's procedure QWidget::closeEvent(event); }