使用 QtDesigner 中的代码弹出 closeEvent 代码

编程入门 行业动态 更新时间:2024-10-28 11:29:19
本文介绍了使用 QtDesigner 中的代码弹出 closeEvent 代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试在按下关闭"按钮时创建一个弹出消息框.我的代码如下所示:

从 PyQt5 导入 QtCore、QtGui、QtWidgets从 PyQt5.QtWidgets 导入 QMessageBox类 Ui_Form(对象):def __init__(self):super().__init__()self.stop_request_1 = 假self.stop_request_2 = 假def setupUi(self, Form):Form.setObjectName("表单")Form.resize(400, 180)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizo​​ntalStretch(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.translateForm.setWindowTitle(_translate("Form", "Form"))self.btn_1.setText(_translate("Form", "btn 1"))self.btn_2.setText(_translate("Form", "btn 2"))def closeEvent(self, event):回复 = QMessageBox.question(self, 'Window Close', '您确定要关闭窗口吗?',QMessageBox.Yes |QMessageBox.No, QMessageBox.No)如果回复 == QMessageBox.Yes:事件.接受()print('窗口关闭')别的:事件.忽略()如果 __name__ == "__main__":导入系统app = QtWidgets.QApplication(sys.argv)表单 = QtWidgets.QWidget()ui = Ui_Form()ui.setupUi(表单)表单.show()sys.exit(app.exec_())

但是当我运行时按下关闭按钮X",弹出窗口不起作用.

窗口刚刚关闭.

你们知道有什么问题吗?

解决方案

您陷入了 PyQt 最常见的错误之一:您正在编辑由 pyuic 实用程序生成的文件.这些文件不是用来作为开始程序的起点,但它们总是必须用作导入的模块.我建议您仔细阅读有关使用 Designer 的文档.>

现在,解决手头的问题:closeEvent() 是 QWidget 类的成员,在 QWidget instance 即将关闭时调用.在您的情况下,它永远不会被调用,因为您已将其设为 Ui_Form 类的成员.

首先,使用pyuic重建ui.然后创建一个 new 脚本(这将是您程序的主脚本),并按照上面给出的设计器文档中指定的第三种方法(多重继承方法),创建 QWidget 的子类,用于你的小部件,然后最终覆盖 closeEvent 那里:

from PyQt5 import QtCore, QtGui, QtWidgets从 PyQt5.QtWidgets 导入 QMessageBox从 ui_form 导入 Ui_Form类 MyWidget(QtWidgets.QWidget, Ui_Form):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.setupUi(self)def closeEvent(self, event):回复 = QMessageBox.question(self, '窗口关闭','你确定要关闭窗户吗?',QMessageBox.Yes |QMessageBox.No, QMessageBox.No)如果回复 == QMessageBox.Yes:事件.接受()print('窗口关闭')别的:事件.忽略()如果 __name__ == "__main__":导入系统app = QtWidgets.QApplication(sys.argv)myWidget = MyWidget()myWidget.show()sys.exit(app.exec_())

记住:永远,永远编辑由 pyuic 生成的文件.

I'm trying to create a pop up message box when the "close" button is pressed. my code looks like as follow:

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_())

But when I run press the close button, "X", the popup window doesnt work.

The window just closes.

Do you guys know what can be wrong ?

解决方案

You've got yourself into one of the most common mistakes of PyQt: you're editing the file generated by the pyuic utility. Those files are not intended for a starting point to begin your program with, but they always have to be used as imported modules. I suggest you to carefully read the documentation about using Designer.

Now, to the problem at hand: closeEvent() is a member of the QWidget class, and is called by the QWidget instance when it is going to be closed. In your case, it will never be called, since you've made it a member of the Ui_Form class.

First of all, rebuild the ui using pyuic. Then create a new script (which will be your main script of your program) and, following the third method specified in the designer documentation given above (the multiple inheritance approach), you create a subclass of QWidget for your widget, then finally override the closeEvent there:

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_())

Remember: never, never edit the files generated by pyuic.

更多推荐

使用 QtDesigner 中的代码弹出 closeEvent 代码

本文发布于:2023-10-06 19:49:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1467653.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:代码   弹出   QtDesigner   closeEvent

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!