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

PyQt5中setWindowFlags禁用QMessageBox关闭按钮无效,求解决

解决PyQt5 QMessageBox禁用关闭按钮失效的问题

你的问题核心是QMessageBox内部会根据标准按钮自动调整窗口标志,直接调用setWindowFlags修改后,后续的按钮设置(哪怕是默认逻辑)会覆盖你的改动,导致关闭按钮依然存在。

下面给出两种靠谱的解决方法:

方法一:提前设置窗口标志,规避自动覆盖

在设置弹窗的标准按钮之前,手动指定窗口标志,移除WindowCloseButtonHint同时保留对话框的核心属性:

from PyQt5 import QtWidgets, QtCore

option_box = QtWidgets.QMessageBox()
# 手动设置窗口标志,不含关闭按钮相关属性
option_box.setWindowFlags(
    QtCore.Qt.Dialog | 
    QtCore.Qt.WindowTitleHint | 
    QtCore.Qt.WindowSystemMenuHint
)
# 按需设置你的标准按钮
option_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
option_box.setText("无法通过关闭按钮关闭的弹窗")
option_box.exec_()

方法二:重写关闭事件,彻底阻止关闭

这种方式不管窗口标志如何,都能拦截关闭操作,更稳定:

from PyQt5 import QtWidgets, QtCore

class LockedMessageBox(QtWidgets.QMessageBox):
    def closeEvent(self, event):
        # 忽略关闭事件,让窗口无法被关闭
        event.ignore()

# 使用自定义弹窗类
option_box = LockedMessageBox()
option_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
option_box.setText("点击关闭按钮也没用的弹窗")
option_box.exec_()

注意:如果选择方法一,必须先设置窗口标志,再设置标准按钮,否则QMessageBox会根据按钮配置重新生成窗口标志,你的修改会被覆盖。

内容的提问来源于stack exchange,提问作者programmer_04_03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:22