1. 程式人生 > 實用技巧 >11. PyQt5 GUI 專案程式框架

11. PyQt5 GUI 專案程式框架

1. 批處理檔案uic.bat

echo off
rem 將子目錄 QtApp下的.ui檔案複製到當前目錄下
copy .\QtApp\Dialog.ui Dialog.ui
rem 用pyuic5編譯.ui檔案
pyuic5 -o ui_Dialog.py Dialog.ui
View Code

- rem 表示註釋

2. 窗體介面檔案

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(
"Dialog") Dialog.resize(451, 317) self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) self.verticalLayout.setContentsMargins(11, 11, 11, 11) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(Dialog) self.groupBox.setObjectName(
"groupBox") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox) self.horizontalLayout_2.setContentsMargins(11, 11, 11, 11) self.horizontalLayout_2.setSpacing(6) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.chkBoxItalic = QtWidgets.QCheckBox(self.groupBox) self.chkBoxItalic.setObjectName(
"chkBoxItalic") self.horizontalLayout_2.addWidget(self.chkBoxItalic) self.chkBoxUnder = QtWidgets.QCheckBox(self.groupBox) self.chkBoxUnder.setObjectName("chkBoxUnder") self.horizontalLayout_2.addWidget(self.chkBoxUnder) self.chkBoxBold = QtWidgets.QCheckBox(self.groupBox) self.chkBoxBold.setObjectName("chkBoxBold") self.horizontalLayout_2.addWidget(self.chkBoxBold) self.verticalLayout.addWidget(self.groupBox) self.label = QtWidgets.QLabel(Dialog) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.lineEdit = QtWidgets.QLineEdit(Dialog) self.lineEdit.setObjectName("lineEdit") self.verticalLayout.addWidget(self.lineEdit) self.groupBox_2 = QtWidgets.QGroupBox(Dialog) self.groupBox_2.setObjectName("groupBox_2") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox_2) self.horizontalLayout_3.setContentsMargins(11, 11, 11, 11) self.horizontalLayout_3.setSpacing(6) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.radioBlue = QtWidgets.QRadioButton(self.groupBox_2) self.radioBlue.setObjectName("radioBlue") self.horizontalLayout_3.addWidget(self.radioBlue) self.radioRed = QtWidgets.QRadioButton(self.groupBox_2) self.radioRed.setObjectName("radioRed") self.horizontalLayout_3.addWidget(self.radioRed) self.radioBlack = QtWidgets.QRadioButton(self.groupBox_2) self.radioBlack.setObjectName("radioBlack") self.horizontalLayout_3.addWidget(self.radioBlack) self.verticalLayout.addWidget(self.groupBox_2) self.textEdit = QtWidgets.QPlainTextEdit(Dialog) font = QtGui.QFont() font.setPointSize(20) font.setBold(True) font.setWeight(75) self.textEdit.setFont(font) self.textEdit.setPlaceholderText("") self.textEdit.setObjectName("textEdit") self.verticalLayout.addWidget(self.textEdit) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSpacing(6) self.horizontalLayout.setObjectName("horizontalLayout") self.btnClear = QtWidgets.QPushButton(Dialog) self.btnClear.setObjectName("btnClear") self.horizontalLayout.addWidget(self.btnClear) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.btnClose = QtWidgets.QPushButton(Dialog) self.btnClose.setObjectName("btnClose") self.horizontalLayout.addWidget(self.btnClose) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.btnOK = QtWidgets.QPushButton(Dialog) self.btnOK.setObjectName("btnOK") self.horizontalLayout.addWidget(self.btnOK) self.verticalLayout.addLayout(self.horizontalLayout) self.label.setBuddy(self.lineEdit) self.retranslateUi(Dialog) self.btnOK.clicked.connect(Dialog.accept) self.btnClose.clicked.connect(Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.chkBoxItalic, self.chkBoxUnder) Dialog.setTabOrder(self.chkBoxUnder, self.chkBoxBold) Dialog.setTabOrder(self.chkBoxBold, self.radioBlue) Dialog.setTabOrder(self.radioBlue, self.radioRed) Dialog.setTabOrder(self.radioRed, self.radioBlack) Dialog.setTabOrder(self.radioBlack, self.textEdit) Dialog.setTabOrder(self.textEdit, self.btnClear) Dialog.setTabOrder(self.btnClear, self.btnClose) Dialog.setTabOrder(self.btnClose, self.btnOK) Dialog.setTabOrder(self.btnOK, self.lineEdit) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "訊號與槽")) self.groupBox.setTitle(_translate("Dialog", "GroupBox")) self.chkBoxItalic.setText(_translate("Dialog", "Italic")) self.chkBoxUnder.setText(_translate("Dialog", "UnderLine")) self.chkBoxBold.setText(_translate("Dialog", "Bold")) self.label.setText(_translate("Dialog", "TextLabel")) self.groupBox_2.setTitle(_translate("Dialog", "GroupBox")) self.radioBlue.setText(_translate("Dialog", "Blue")) self.radioRed.setText(_translate("Dialog", "Red")) self.radioBlack.setText(_translate("Dialog", "Black")) self.textEdit.setPlainText(_translate("Dialog", "PyQt5程式設計指南\n" "Python和Qt")) self.btnClear.setText(_translate("Dialog", "清空")) self.btnClose.setText(_translate("Dialog", "退出")) self.btnOK.setText(_translate("Dialog", "確定"))
View Code

- 任務:介面建立和訊號與槽函式的關聯

- 介面建立

  -groupBox是佈局管理元件[groupBox = QtWidgets.QGroupBox(Dialog)],父容器是Dialog

  -horizontalLayout_2是建立的水平佈局[horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox)],父容器是groupBox

- 訊號與槽關聯

  -self.btnOK.clicked.connect(Dialog.accept) btnOK按鈕的clicked訊號與accept()函式關聯

  -self.btnClose.clicked.connect(Dialog.reject) btnClose按鈕的clicked訊號與reject()函式關聯

  - 訊號與槽函式關聯使用connect()函式

  - 發射訊號物件.訊號.connect(接收訊號物件.槽函式名稱)

3. 窗體業務邏輯類檔案

# 與UI窗體類對應的業務邏輯類
import sys
from PyQt5.QtWidgets import QApplication, QDialog
from ui_Dialog import Ui_Dialog


class QmyDialog(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)        #呼叫父類建構函式建立窗體
        self.ui = Ui_Dialog()           #建立UI物件
        self.ui.setupUi(self)           #構造Ui


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainform = QmyDialog()
    mainform.show()
    sys.exit(app.exec_())
View Code

4. 建議單獨編寫主程式檔案

import sys
from PyQt5.QtWidgets import QApplication
from myDialog import QmyDialog


app =QApplication(sys.argv)     #建立GUI應用程式
mainform = QmyDialog()          #建立主窗體
mainform.show()                 #顯示主窗體
sys.exit(app.exec_())
View Code