PyQt5 - 03 使用代码编写基于pyqt5的gui程序
2018-03-08 13:41
721 查看
前两篇博文是使用qt creator来创建pyqt5界面,这篇博文主要讲自己编写代码实现GUI界面并重写closeEvent()方法。
实现过程:继承QDialog类或其他窗体的类->定义需要控件->设置控件属性->将控件添加到布局->将布局添加到窗体->重写closeEvent(方法)
与自动生成的py文件的不同:
- 直接继承QDialog类,那么在main()函数中就可以直接show()自己创建的类的对象;
- 由于继承了QDialog类且show()的对象是自己创建的类生成的,那么可以直接在自己定义的类中对closeEvent()方法重写。
直接上代码:
以上一篇博文为原型,重新编写
以下是自动生成的代码:
与自动生成的代码比较,我们会发现代码更简洁、可读性更高了。
所以推荐大家熟悉pyqt后,尽量自己来写ui代码。
实现过程:继承QDialog类或其他窗体的类->定义需要控件->设置控件属性->将控件添加到布局->将布局添加到窗体->重写closeEvent(方法)
与自动生成的py文件的不同:
- 直接继承QDialog类,那么在main()函数中就可以直接show()自己创建的类的对象;
- 由于继承了QDialog类且show()的对象是自己创建的类生成的,那么可以直接在自己定义的类中对closeEvent()方法重写。
直接上代码:
以上一篇博文为原型,重新编写
from PyQt5 import QtCore, QtGui, QtWidgets import sys class Ui_Dialog(QtWidgets.QDialog): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 对可能继承的参数进行接收 # super(Ui_Dialog, self).__init__() # 也可使用这句代码代替上一句,这句就可以确定不会接收参数了 # 设定窗体属性 self.setObjectName("Dialog") self.resize(640, 480) # 定义控件 self.label = QtWidgets.QLabel() self.label_2 = QtWidgets.QLabel() self.textBrowser = QtWidgets.QTextBrowser() self.lineEdit = QtWidgets.QLineEdit() self.pushButton = QtWidgets.QPushButton() # 定义布局 self.h_box1_layout = QtWidgets.QHBoxLayout() self.h_box2_layout = QtWidgets.QHBoxLayout() self.v_box_layout = QtWidgets.QVBoxLayout() # 将控件添加到布局 self.h_box1_layout.addWidget(self.label) self.h_box1_layout.addWidget(self.lineEdit) self.h_box1_layout.addWidget(self.pushButton) self.h_box2_layout.addWidget(self.label_2) self.h_box2_layout.addWidget(self.textBrowser) self.v_box_layout.addLayout(self.h_box1_layout) self.v_box_layout.addLayout(self.h_box2_layout) # 将布局加入窗体 self.setLayout(self.v_box_layout) # 设定控件属性 _translate = QtCore.QCoreApplication.translate self.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 ->")) # 重写closeEvent()方法 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) ui = Ui_Dialog() # 创建窗体对象 ui.show() # 显示窗体对象 sys.exit(app.exec_()) if __name__ == '__main__': main()
以下是自动生成的代码:
# -*- 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, '本程序', a3d6 "是否要退出程序?", 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()
与自动生成的代码比较,我们会发现代码更简洁、可读性更高了。
所以推荐大家熟悉pyqt后,尽量自己来写ui代码。
相关文章推荐
- 使用PyQt来编写第一个Python GUI程序
- 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写
- 使用PyQt来编写第一个Python GUI程序
- 使用PyQt来编写第一个Python GUI程序
- 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
- 使用PyQt来编写第一个Python GUI程序
- 使用PyQt来编写第一个Python GUI程序
- 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)
- 使用PyQt来编写第一个Python GUI程序
- 使用PyQt来编写第一个Python GUI程序
- 使用C++语言编写多线程程序的速成代码
- [编写高质量代码:改善java程序的151个建议]建议58 强烈建议使用UTF-8编码
- [编写高质量代码:改善java程序的151个建议]建议52 推荐使用String直接量赋值
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝
- [编写高质量代码:改善java程序的151个建议]建议68 频繁插入和删除时使用LinkedList