使用 QtDesigner 中的代码弹出 closeEvent 代码
popup closeEvent code with code from QtDesigner
我正在尝试在按下 "close" 按钮时创建一个弹出消息框。
我的代码如下所示:
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",弹出窗口window不起作用。
window刚刚关门。
你们知道什么是错误的吗?
您陷入了 PyQt 最常见的错误之一:您正在编辑由 pyuic 实用程序生成的文件。
这些文件并非旨在作为开始您的程序的起点,但它们始终 必须用作导入模块。我建议你仔细阅读关于 using Designer.
的文档
现在,解决手头的问题:closeEvent()
是QWidgetclass的成员,并且在QWidget实例被调用时被调用将被关闭。在您的情况下,它永远不会被调用,因为您已将其设为 Ui_Form
class.
的成员
首先,使用 pyuic 重新 uild ui。
然后创建一个 new 脚本(这将是您程序的主脚本),然后按照上面给出的设计器文档中指定的第三种方法(多重继承方法)创建一个子class 的 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.
生成的文件
我正在尝试在按下 "close" 按钮时创建一个弹出消息框。 我的代码如下所示:
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",弹出窗口window不起作用。
window刚刚关门。
你们知道什么是错误的吗?
您陷入了 PyQt 最常见的错误之一:您正在编辑由 pyuic 实用程序生成的文件。
这些文件并非旨在作为开始您的程序的起点,但它们始终 必须用作导入模块。我建议你仔细阅读关于 using Designer.
现在,解决手头的问题:closeEvent()
是QWidgetclass的成员,并且在QWidget实例被调用时被调用将被关闭。在您的情况下,它永远不会被调用,因为您已将其设为 Ui_Form
class.
首先,使用 pyuic 重新 uild ui。 然后创建一个 new 脚本(这将是您程序的主脚本),然后按照上面给出的设计器文档中指定的第三种方法(多重继承方法)创建一个子class 的 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.
生成的文件