您的位置:首页 > 产品设计 > UI/UE

PyQt5 - 03 使用代码编写基于pyqt5的gui程序

2018-03-08 13:41 721 查看
前两篇博文是使用qt creator来创建pyqt5界面,这篇博文主要讲自己编写代码实现GUI界面并重写closeEvent()方法。

实现过程:继承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代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python pyqt5 gui ui closeEvent