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
相关产品推荐
相关产品推荐

