PyQt5 - 02 对closeEvent()重写,添加关闭窗口触发的事件
2018-03-08 09:55
1241 查看
对《PyQt5 - 01 使用qt creator创建第一个pyqt5界面程序》中的程序进行修改,通过重写closeEvent()方法实现退出时给出提示框
对.ui文件生成的代码修改:
《PyQt5 - 01 使用qt creator创建第一个pyqt5界面程序》中的源码:# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'dialog.ui' # # Created by: PyQt5 UI code generator 5.10.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets import sys class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(640, 480) self.pushButton = QtWidgets.QPushButton(Dialog) self.pushButton.setGeometry(QtCore.QRect(370, 80, 113, 32)) self.pushButton.setObjectName("pushButton") self.lineEdit = QtWidgets.QLineEdit(Dialog) self.lineEdit.setGeometry(QtCore.QRect(140, 80, 113, 21)) self.lineEdit.setObjectName("lineEdit") self.textBrowser = QtWidgets.QTextBrowser(Dialog) self.textBrowser.setGeometry(QtCore.QRect(180, 200, 256, 192)) self.textBrowser.setObjectName("textBrowser") self.label = QtWidgets.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(30, 80, 111, 16)) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(Dialog) self.label_2.setGeometry(QtCore.QRect(30, 220, 141, 16)) self.label_2.setObjectName("label_2") self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.pushButton.setText(_translate("Dialog", "PushButton")) self.label.setText(_translate("Dialog", "这是Line Edit ->")) self.label_2.setText(_translate("Dialog", "这是Text Browser ->")) def main(): """ 主函数,用于运行程序 :return: None """ app = QtWidgets.QApplication(sys.argv) dialog = QtWidgets.QDialog() ui = Ui_Dialog() ui.setupUi(dialog) dialog.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
分析main()函数:
def main(): """ 主函数,用于运行程序 :return: None """ app = QtWidgets.QApplication(sys.argv) dialog = QtWidgets.QDialog() # 创建一个QDialog窗口对象, ui = Ui_Dialog() # 创建一个自定义的控件布局对象 ui.setupUi(dialog) # 将布局传入QDialog窗口 dialog.show() # 显示QDialog窗口 sys.exit(app.exec_())
从main()方法中看到我们最终显示的是QDialog类创建的窗口对象,如果想要实现关闭窗口触发弹窗提示或执行一些其他方法,需要重写的是QDialog类中的closeEvent()方法,而不是重写我们创建的Ui_Dialog类的closeEvent()方法。
原理:关闭窗口时会执行类的close()方法,并触发QCloseEvent信号,进而执行closeEvent(self, QCloseEvent)方法。
添加代码如下:
class Dialog(QtWidgets.QDialog): """对QDialog类重写,实现一些功能""" def closeEvent(self, event): """ 重写closeEvent方法,实现dialog窗体关闭时执行一些代码 :param event: close()触发的事件 :return: None """ reply = QtWidgets.QMessageBox.question(self, '本程序', "是否要退出程序?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore()
完整代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'dialog.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(640, 480)
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(370, 80, 113, 32))
self.pushButton.setObjectName("pushButton")
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(140, 80, 113, 21))
self.lineEdit.setObjectName("lineEdit")
self.textBrowser = QtWidgets.QTextBrowser(Dialog)
self.textBrowser.setGeometry(QtCore.QRect(180, 200, 256, 192))
self.textBrowser.setObjectName("textBrowser")
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(30, 80, 111, 16))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(30, 220, 141, 16))
self.label_2.setObjectName("label_2")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "PushButton"))
self.label.setText(_translate("Dialog", "这是Line Edit ->"))
self.label_2.setText(_translate("Dialog", "这是Text Browser ->"))
class Dialog(QtWidgets.QDialog): """对QDialog类重写,实现一些功能""" def closeEvent(self, event): """ 重写closeEvent方法,实现dialog窗体关闭时执行一些代码 :param event: close()触发的事件 :return: None """ reply = QtWidgets.QMessageBox.question(self, '本程序', "是否要退出程序?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore()
def main():
"""
主函数,用于运行程序
:return: None
"""
app = QtWidgets.QApplication(sys.argv)
dialog = Dialog() # 注意修改为了自己重写的Dialog类
ui = Ui_Dialog()
ui.setupUi(dialog)
dialog.show() # 显示了自己重写的Dialog类
sys.exit(app.exec_())
if __name__ == '__main__':
main()
相关文章推荐
- 重写窗口关闭触发事件
- 重写窗口关闭触发事件
- c#winform关闭窗口时触发的事件
- 窗口关闭触发事件
- c#禁止窗口关闭方法(重写关闭事件)
- 设为首页、添加到收藏夹、更改地址栏前小图标、按下回车键事件、关闭窗口
- 弹出窗口关闭后如何触发父窗口事件 [转帖]
- js关闭窗口时触发事件方法
- 自定义WPF关闭窗口事件触发的函数
- ionic开发——百度地图InfoWindow信息窗口上添加按钮,无法触发点击事件问题解决办法
- 关闭窗口触发事件(onunload和unbeforeunload)
- js监听和触发浏览器窗口关闭事件
- JAVA GUI学习 - 窗口【x】按钮关闭事件触发器:重写processWindowEvent(WindowEvent e)方法
- jsp 关闭窗口触发的事件
- Winform捕获窗口关闭按钮触发的事件
- easyui之关闭窗口时触发关闭事件
- wpf中重写OnClosing窗口关闭事件报错
- easyui-window 关闭事件,只要关闭窗口就会触发
- 关闭窗口时触发事件(屏蔽刷新时触发)
- easyui-window 关闭事件,只要关闭窗口就会触发