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

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

  1. 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上节说的,这里可以看到通过yml配置路由,到右边对应起来,可以看到 predicates 这个是断 ...

  2. PyQt5 随笔:信号与槽的两种使用方法:@pyqtSlot() 和 connect()

    PyQt5 随笔:信号与槽的两种连接方法:@pyqtSlot() 和 connect() 1. @pyqtSlot() @pyqtSlot()有两种使用情况.如下面两个例子. 例子1:一个信号时,如p ...

  3. php apk 签名验证,Android_如何安装系统认证签名过的APK,解决方法有如下两种: 第一 - phpStudy...

    如何安装系统认证签名过的APK 解决方法有如下两种: 第一种 如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/apps 下面去 mm ...

  4. 页面导航的两种方式——声明式导航、编程式导航||vue-router编程式导航||router.push() 方法的参数规则

    页面导航的两种方式 vue-router编程式导航 编程式导航基本用法 <!DOCTYPE html> <html lang="en"><head&g ...

  5. jquery、javascript实现(get、post两种方式)跨域解决方法

     jquery.javascript实现(get.post两种方式)跨域解决方法 一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(fun ...

  6. 注册事件的两种方式(传统注册事件、方法监听注册事件)

    注册事件的两种方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  7. drf-路由组件:自动生成Routers路由、 使用方法、视图集中附加action的声明、自动生成路由router的两种方式的URL区别

    目录 一. 自动生成Routers路由 二. 使用方法 1) 创建router对象,并注册视图集,例如 2)添加路由数据 三. 代码演示 四. 视图集中附加action的声明 五. 自动生成路由rou ...

  8. 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解

    1.操作系统(推荐查看书籍:现代操作系统)     操作系统是位于计算机硬件与软件之间的控制程序     作用:         1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用      ...

  9. android 图片方法,分享实现Android图片选择的两种方式

    Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static final int PICTU ...

最新文章

  1. 到底什么是生成式对抗网络GAN?
  2. Oracle 统计信息(1)
  3. Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
  4. Vue—基础概念—组建化
  5. iOS开发事件分发机制—响应链—手势影响
  6. 小度拆卸_拆卸invokedynamic
  7. 为啥加班多太多对身体会造成影响,不干活就不会对身体造成影响么?
  8. Excel做文件归档
  9. Docker 学习笔记
  10. VUE学习(二):修改下拉框样式
  11. 要做就做明链,这才是堂堂正正的优化之路,不要走捷径
  12. 图表可视化配色学习——自动提取图片主色调与配色方案(python、pillow、haishoku和seaborn),并生成十六进制颜色编码
  13. 沉思录三:敏捷开发的精髓是什么
  14. Android 内存卡 / Micro SD 卡 / TF 卡 / 存储卡 剩余容量 / 剩余内存 / 可用空间、总容量的 2 种获取方式
  15. oracle audit_actions,配置Oracle安全审计选项audit
  16. 宾得最小饼干DA 40mm F2.8 Limited[转]_我是亲民_新浪博客
  17. 高级计算机网络内容介绍,高级计算机网络-课程介绍课件.ppt
  18. 消愁,一杯敬故乡,一杯敬远方
  19. 如何快速写完SCI论文
  20. Matlab/Simulink之STM32开发

热门文章

  1. 窑鸡厂Java大数据岗二面相关面试题
  2. 微信小程序开发(十)小程序支付-查询退款
  3. linux mint安装时窗口太大,Linux Mint安装日记
  4. TextView复合文本的输入
  5. 机器学习模型训练步骤
  6. 调用优酷视频的API,兼容手机和PC浏览器
  7. 计算机应用基础自考综合题,计算机应用基础自考精选练习题
  8. 天玑810和骁龙870哪个好
  9. VisualVM安装
  10. 缓解电脑卡顿、释放内存的几种方法: