You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt区分Windows下点击X按钮与系统关机触发的关闭事件

可行,给你个Windows平台下的具体实现方案

核心思路是通过捕获Windows系统发送的关机消息,提前标记关闭原因,再在closeEvent里根据这个标记决定是否弹出提示框:

  1. 给你的QMainWindow类加个成员变量,用来标记是否是系统关机触发的关闭:
private:
    bool m_isSystemShutdown = false;
  1. 重写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);
}
  1. 修改你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:45:11