python - 使用来自 QtDesigner 的代码弹出 closeEvent 代码
问题描述
当按下“关闭”按钮时,我正在尝试创建一个弹出消息框。我的代码如下所示:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
class Ui_Form(object):
def __init__(self):
super().__init__()
self.stop_request_1 = False
self.stop_request_2 = False
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 180)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
Form.setSizePolicy(sizePolicy)
Form.setMinimumSize(QtCore.QSize(400, 180))
Form.setMaximumSize(QtCore.QSize(400, 180))
self.btn_1 = QtWidgets.QPushButton(Form)
self.btn_1.setGeometry(QtCore.QRect(30, 60, 86, 26))
self.btn_1.setIconSize(QtCore.QSize(20, 20))
self.btn_1.setObjectName("btn_1")
self.btn_2 = QtWidgets.QPushButton(Form)
self.btn_2.setGeometry(QtCore.QRect(250, 60, 86, 26))
self.btn_2.setObjectName("btn_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.btn_1.setText(_translate("Form", "btn 1"))
self.btn_2.setText(_translate("Form", "btn 2"))
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
print('Window closed')
else:
event.ignore()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
但是当我运行按下关闭按钮“X”时,弹出窗口不起作用。
窗口只是关闭。
你们知道有什么问题吗?
解决方案
您陷入了 PyQt 最常见的错误之一:您正在编辑由 pyuic 实用程序生成的文件。
这些文件不是作为程序开始的起点,但它们总是必须用作导入的模块。我建议您仔细阅读有关使用 Designer的文档。
现在,手头的问题:closeEvent()
是 QWidget 类的成员,并且在 QWidget实例将要关闭时调用它。在你的情况下,它永远不会被调用,因为你已经让它成为Ui_Form
类的成员。
首先,使用pyuic重建ui。然后创建一个新脚本(这将是您程序的主脚本),并按照上面给出的设计器文档中指定的第三种方法(多重继承方法),为您的小部件创建 QWidget 的子类,然后最终覆盖closeEvent 那里:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from ui_form import Ui_Form
class MyWidget(QtWidgets.QWidget, Ui_Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setupUi(self)
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Window Close',
'Are you sure you want to close the window?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
print('Window closed')
else:
event.ignore()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
myWidget = MyWidget()
myWidget.show()
sys.exit(app.exec_())
记住:永远,永远不要编辑 pyuic 生成的文件。
推荐阅读
- churchtools - 允许用户在 ChurchTools 中使用公共表单注册
- html - 如何使用 vb.net 读取 HTML 元素?
- docker - 如何在 docker compose 文件中指定容器选项?
- spring - common.KafkaException:com.fasterxml.jackson.databind.ser.std.StringSerializer 不是 org.apache.kafka.common.serialization.Serializer 的实例
- reactjs - 安全地管理托管在 Cloudfront Distribution 后面的 S3 中的 React 应用程序的配置数据
- c# - 要使用什么 XML 属性?
- unit-testing - 使用 http 作为包装函数依赖项的单元测试
- wordpress - Docker 卷映射同步文件从客户机到主机
- reactjs - React Stateless Component 无法在 typescript 中编译
- java - 为什么在尝试使用库中的类时出现“无法解析符号”?