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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM