zoukankan      html  css  js  c++  java
  • PyQt5创建第一个窗体(正规套路)

    一、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_())

  • 相关阅读:
    python 类型注解
    python 装饰器
    python 高阶函数、柯里化
    python 生成器函数
    python 递归和匿名函数
    Python 函数返回值、作用域
    Python 练习题总结(待续)
    基于 K8S 集群安装部署 istio-1.2.4
    基于 kubeadm 部署 kubernetes(v1.17.0) 集群
    Gitlab 重置 root 密码
  • 原文地址:https://www.cnblogs.com/shelwinnee/p/5432304.html
Copyright © 2011-2022 走看看