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

本文介绍在PyQt5开发中如何通过重写closeEvent()方法实现关闭窗口时的自定义操作,如通知服务器用户已断开。文章提供两种常见实现方式:自定义类+继承和在自定义窗口直接重写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@[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中方法的程序员比较方便。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值