900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > pyqt5笔记 — 重写窗口方法closeEvent()的两种方式

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

时间:2022-03-07 06:45:13

相关推荐

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")# 自定义窗口,继承QWidgetclass 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中方法的程序员比较方便。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。