Qt区分Windows下点击X按钮与系统关机触发的关闭事件
可行,给你个Windows平台下的具体实现方案
核心思路是通过捕获Windows系统发送的关机消息,提前标记关闭原因,再在closeEvent里根据这个标记决定是否弹出提示框:
- 给你的
QMainWindow类加个成员变量,用来标记是否是系统关机触发的关闭:
private: bool m_isSystemShutdown = false;
- 重写
nativeEvent方法,捕获Windows的WM_QUERYENDSESSION消息(系统关机/重启时会给所有窗口发这个消息):
#include <windows.h> bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) { MSG* msg = static_cast<MSG*>(message); if (msg->message == WM_QUERYENDSESSION) { m_isSystemShutdown = true; *result = TRUE; // 告诉系统我们允许关闭 return true; } return QMainWindow::nativeEvent(eventType, message, result); }
- 修改你的
closeEvent逻辑,根据标记判断是否弹出提示:
void MainWindow::closeEvent(QCloseEvent *event) { // 如果是系统关机触发的关闭,直接同意,不弹提示 if (m_isSystemShutdown) { event->accept(); return; } // 用户手动点X关闭的情况,弹出确认框 QMessageBox::StandardButton reply = QMessageBox::question(this, "确认退出", "确定要退出吗?", QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { event->accept(); } else { event->ignore(); } }
为什么aboutToQuit信号没用?因为Qt的事件顺序是closeEvent先触发,之后才会发出aboutToQuit,所以等你收到这个信号的时候,提示框早就弹出来了,根本赶不上。
内容的提问来源于stack exchange,提问作者n3mo
相关产品推荐
相关产品推荐

