返回顶部

[Python] PyQt5创建第一个窗体(正规套路)

[复制链接]
awagink 显示全部楼层 发表于 2021-1-3 19:55:57 |阅读模式 打印 上一主题 下一主题
一、Pyqt5 创建第一个窗体
很多人写窗体程序都是直接敲代码,不使用设计器,我个人不是很赞成这种做法。使用设计器的好处是直观、维护方便,尤其开发复杂窗体的效率高。
但是每次修改ui文件后,需要重新生成py文件,会将原来的内容覆盖掉,为了避免这种情况,引入了一个中间类。主要步骤如下:
1使用QtDesigner创建一个简单的对话框,保存成simpleDialog.ui。
2使用cmd,进入simpleDialog.ui文件所在的目录,运行命令pyuic5 simpleDialog.ui >ui_simpleDialog.py
3打开ui_simpleDialog.py,pyqt自动生成的代码如下(无需任何修改):
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):#注意pyqt5窗体从object继承,不是QMainWindow了
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(60, 70, 241, 131))
        self.pushButton.setObjectName("pushButton")
        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))
可以看到刚才新建的对话框的类名称是”Ui_Form”。
4新建一个simpleDialog.py文件,编写代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from ui_simpledialog import Ui_Form
import sys
class SimpleDialogForm(Ui_Form):#从自动生成的界面类继承
    def __init__(self, parent = None):
        super(SimpleDialogForm, self).__init__()
    def yourFunctions(self):
        Pass
  #这个类中处理你自己的业务逻辑。界面ui可随心所欲的修改,不影响你已经编写的逻辑。
自定义一个类(SimpleDialogForm)继承自pyqt自动生成的类,然后覆写”构造函数”,剩余的工作就是你自己想要添加的功能了。
5完善运行测试代码,如下:
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = QtWidgets.QMainWindow()#创建一个主窗体(必须要有一个主窗体)
    content = SimpleDialogForm()#创建对话框
    content.setupUi(main)#将对话框依附于主窗体
    main.show()#主窗体显示
sys.exit(app.exec_())
6为什么要这么做?
基于界面与实现分离的原则,我们使用QtDesigner设计的窗体,仅仅作为界面使用,具体业务逻辑通过单独的文件实现,这样以后如果界面发生变动,pyqt自动生成窗体代码时不会覆盖掉我们已经编写的业务逻辑。
7推荐的做法:
为了有良好的封装性,将中间类修改为:
class SimpleDialogForm(Ui_Form, QtWidgets.QMainWindow):
  def __init__(self, parent = None):
          super(SimpleDialogForm, self).__init__()
          self.setupUi(self)#在此设置界面
          #在此,可添加自定义的信号绑定
          self.pushButton.clicked.connect(self.openFile)
          self.pushButton_2.clicked.connect(self.closeApp)
测试代码这样写:
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = SimpleDialogForm()
    main.show()#在外面只需要调用simpleDialogForm显示就行,不需要关注内部如何实现了。
    sys.exit(app.exec_())



您需要登录后才可以回帖 登录 | 注册

本版积分规则

纳速健身网成立于2006年8月,是国内优秀健身运动网站,现拥浏览人数超30万。网站是集养生、武术、太极拳和健身气功等多种健身项目于一体的多功能交流平台。平台提供大量优质的教学视频、伴奏音乐(太极拳晨练音乐,广场舞音乐,健身气功音乐)、图文教程、运动科普和经验分享,为健身爱好者提供完善的运动指导平台。
  • 纳速QQ群乙:151815303
  • 纳速QQ群丙:79104490
  • 微信交流群:微信好友搜索【nasuwang】加小纳微信进群交流健身知识,备注【纳速】
  •                     或者扫描页面底部右侧二维码添加小纳微信>>>
  • 微信公众号

  • 微信群客服交流

  • Copyright © 2006-2021, 纳速健身网. | | 辽ICP备13002388号-1 辽公安网备21050202000005号公安网备号 纳速武术-乙 QQ