pyqt5笔记 — 重写窗口方法closeEvent()的两种方式

@[TOC](pyqt5笔记 — 重写窗口方法closeEvent()的两种方式)

一、重写的作用

在开发过程中,经常会遇到一种需求:服务器端在主动发出一些信息给客户端,而在用户端关闭UI的时候,需要通知服务器端这个用户已经断开了,不用再给这个用户发送了,而用户端在关闭的时候往往都是最简单的右上角X,用户在点击右上角的关闭键时会自动触发窗口的closeEvent()事件,而窗口原本的closeEvent()仅仅是关闭功能,而我们要想在关闭的时候告诉服务器这个用户的关闭行为,就需要扩展closeEvent()的内容,重写的作用就在于此了。

二、常见重写方式:自定义类+继承

# 主窗口类
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1041, 860)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(370, 80, 113, 32))
        self.pushButton.setObjectName("pushButton")
 
# 自定义窗口,继承QWidget
class MyWidget(QWidget):
"""
重写closeEvent方法
"""
    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self, "标题", "亲,你确定想关闭我?别后悔!!!'_'", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if(result == QtWidgets.QMessageBox.Yes):
            event.accept()
            # 通知服务器的代码省略,这里不是重点...
        else:
            event.ignore()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    parent = MyWidget()   # 自定义的QWidget窗口
    sub = Ui_Form()   # 主窗口
    sub.setupUi(parent)   # 子窗口继承自定义QWidget窗口
    parent.show()
	sys.exit(app.exec_())

三、最简单方式:在继承QWidget的自定义窗口中直接重写

如果你搜索重写closeEvent()方法,你看到的搜索结果99%都是上面的写法,所以我这里把上面列为最常见的写法,但是个人认为这种写法使用率并不高,还有更简单的的写法,即直接在自定义子窗口中重写,然后在重写的closerEvent()中添加父类(QWidget)方法super().enterEvent(a0),不覆盖父类方法即可。

# 一般我们都是用Qtdisigner来创建窗口,所以自定义窗口时,我们会继承两个父类QWidget和Qtdisigner创建的窗口
class ClientWindow(QtWidgets.QWidget, Ui_Form):
    """
    主窗口,父类1:QtWidgets.QWidget;父类2:Qtdisigner创建的窗口和控件类 Ui_Form
    """
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("窗口标题")
        self.showMaximized()  # 窗口最大化
        icon = QtGui.QIcon(os.getcwd() + "/resource/image/logo.png")  # 设置窗口图标
        self.setWindowIcon(icon)
        
    def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
        """
        重写QWidget类的closrEvent方法,在窗口被关闭的时候自动触发
        """
        super().closeEvent(a0)  # 先添加父类的方法,以免导致覆盖父类方法(这是重点!!!)
        tcp = TmClient(self.server_ip, self.server_tcp_port)  # 这是另外一个TCP连接服务器的lei,这里只是创建实例的引用,没有把类拷贝上来
        tcp.client_send("exit")  # 通过tcp连接告诉服务器这个用户退出了!
        tcp.client_close()

总结,目前敝人喜欢第二种方式,其实还有一种比较高级重写的方法,即重写QWidget模块MyWidget(),在Qtdisigner中创建控件时直接提升为自定义的MyWidget,对于经常用到重写QWidget中方法的程序员比较方便。

原创文章 12 获赞 20 访问量 1469

猜你喜欢

转载自blog.csdn.net/wuwei_201/article/details/105731226