初探在Pycharm中使用QT開發GUI頁面,安裝配置以完整項目代碼

目錄

由於項目要求最近在看GUI開發的一些知識,在瞭解了Python的tkinter庫跟QT之後,分別做了一版。其中QT更便於上手,功能更加豐富,開發速度與可維護性都比較好,所以對Python 開發QT做一個長期的學習記錄。

本文章包括所用到的組件安裝,以及將一個新項目從創立到打包成exe可執行程序的全過程。

QT and PyQt5 介紹

QT是跨平臺的C++開發庫,主要用來開發用戶圖形界面程序(GUI),當然它的功能不止與此,還可以用來繪製漂亮的界面(包括控件,交互,佈局),處理多線程,訪問數據庫,圖像跟音視頻的處理,網絡通信,文件操作等。

Qt Designer是PyQt程序UI界面的實現工具,Qt Designer工具使用簡單,可以通過拖拽和點擊完成複雜界面設計,並且設計完成的.ui程序可以轉換成.py文件供python程序調用。本文主要通過用戶登錄需求描述Qt Designer工具開發界面的使用方法。

PyQt5是使用Python語言根據QT設計的爲了在Python上使用的,本文使用的是Python3。

PyQt5的類別分爲幾個模塊,包括以下:

  • QtCore
    包含了核心的非GUI功能。此模塊用於處理時間、文件和目錄、各種數據類型、流、URL、MIME類型、線程或進程。
  • QtGui
    包含類窗口系統集成、事件處理、二維圖形、基本成像、字體和文本。
  • qtwidgets
    模塊包含創造經典桌面風格的用戶界面提供了一套UI元素的類。
  • QtMultimedia
    包含的類來處理多媒體內容和API來訪問相機和收音機的功能。
  • Qtbluetooth
    模塊包含類的掃描設備和連接並與他們互動。描述模塊包含了網絡編程的類。這些類便於 TCP和IP和UDP客戶端和服務器的編碼,使網絡編程更容易和更便攜。
  • Qtpositioning
    包含類的利用各種可能的來源,確定位置,包括衛星、Wi-Fi、或一個文本文件。
  • Enginio
    模塊實現了客戶端庫訪問Qt雲服務託管的應用程序運行時。
  • Qtwebsockets
    模塊包含實現WebSocket協議類。
  • QtWebKit
    包含一個基於Webkit2圖書館Web瀏覽器實現類。
  • Qtwebkitwidgets
    包含的類的基礎webkit1一用於qtwidgets應用Web瀏覽器的實現。
  • QtXml
    包含與XML文件的類。這個模塊爲SAX和DOM API提供了實現。
  • QtSvg
    模塊提供了顯示SVG文件內容的類。可伸縮矢量圖形(SVG)是一種描述二維圖形和圖形應用的語言。。
  • QtSql
    模塊提供操作數據庫的類
  • QtTest
    包含的功能,使pyqt5應用程序的單元測試

安裝

請自行安裝pycharm並且配置Python

創建一個完整項目

使用QTDesigner設計UI界面

  • 打開

這裏是引用

  • 界面介紹
    在這裏插入圖片描述
    菜單欄 區域:用來新建窗口,保存,提供佈局快捷鍵
    拖拽組件 區域 :提供Gui界面開發各種基本控件,如單選框、文本框、按鈕等。可以拖動到新創建的主程序界面。在後續的文章中將介紹各個組件的作用

    控件對象列表 區域 :查看主窗口放置的對象列表。

    控件屬性更改 區域: 提供對窗口、控件、佈局的屬性編輯功能。比如修改控件的顯示文本、對象名、大小等。下面的編輯控件的信號和槽函數,也可以添加自定義的信號和槽函數。

  • 步驟
    1.新建一個空白窗口
    在這裏插入圖片描述
    在這裏插入圖片描述
    2.拖入組件,並調整屬性,這裏我們用一個簡單的例子,只包括一個按鈕,一個標籤跟兩個文本框(輸入輸出)
    在這裏插入圖片描述
    在這裏插入圖片描述
    3來點擊保存/另存爲,會生成一個.ui文件,這裏我命名爲’example_ui’
    在這裏插入圖片描述

編寫py文件來組合UI界面跟業務邏輯

  1. 首先需要將.ui文件更改爲.py文件
    使用命令行pyuic5 -o example_ui.py example_ui.ui轉換成.py文件。調用格式爲pyuic5 -o {輸出文件名} {輸入designer設計好的.ui後綴界面文件}。得到的.py文件如下
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'example_ui.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(315, 206)
        self.layoutWidget = QtWidgets.QWidget(Form)
        self.layoutWidget.setGeometry(QtCore.QRect(50, 50, 201, 111))
        self.layoutWidget.setObjectName("layoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.textBrowser = QtWidgets.QTextBrowser(self.layoutWidget)
        self.textBrowser.setObjectName("textBrowser")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.textBrowser)
        self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.pushButton)
        self.textEdit = QtWidgets.QTextEdit(self.layoutWidget)
        self.textEdit.setObjectName("textEdit")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.textEdit)
        self.label = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "完成"))
        self.label.setText(_translate("Form", "請輸入:"))

2.因爲生成的代碼塊只是UI界面的部分,具體的將界面展示以及邏輯串聯還需要進一步的工作,爲了後續的維護方便,實現邏輯清晰,將頁面與業務邏輯相分離,新建一個example_main.py文件,調用example_ui文件
首先保持窗口可執行

# 導入程序運行必須模塊
import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模塊中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 導入designer工具生成的login模塊
from example_ui import Ui_Form


class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)

        self.setupUi(self)


if __name__ == "__main__":
    # 固定的,PyQt5程序都需要QApplication對象。sys.argv是命令行參數列表,確保程序可以雙擊運行
    app = QApplication(sys.argv)
    # 初始化
    myWin = MyMainForm()
    # 將窗口控件顯示在屏幕上
    myWin.show()
    # 程序運行,sys.exit方法確保程序完整退出。
    sys.exit(app.exec_())

點擊運行,效果如下圖:
在這裏插入圖片描述
3.此時點擊按鈕還沒有任何反應,再寫一個簡單的邏輯來點擊’完成’按鈕時,輸出框輸出輸入的值
加入邏輯:

# 導入程序運行必須模塊
import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模塊中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 導入designer工具生成的login模塊
from example_ui import Ui_Form


class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        #給按鈕添加點擊事件,調用display函數
        self.pushButton.clicked.connect(self.display)
    def display(self):
        #利用toPllainText()來獲取textEdit的輸入值
        MyInput = self.textEdit.toPlainText()
        #利用setText()來對textBrowser控件輸出值
        self.textBrowser.setText(MyInput)
if __name__ == "__main__":
    # 固定的,PyQt5程序都需要QApplication對象。sys.argv是命令行參數列表,確保程序可以雙擊運行
    app = QApplication(sys.argv)
    # 初始化
    myWin = MyMainForm()
    # 將窗口控件顯示在屏幕上
    myWin.show()
    # 程序運行,sys.exit方法確保程序完整退出。
    sys.exit(app.exec_())

運行效果如下圖:
在這裏插入圖片描述
這樣就完成了, 在輸出框展示通過按鈕點擊獲取輸入框的時間,使用以上知識就可以完成一些簡單的功能開發了。

將py文件打包成exe程序

首選安裝pyinstaller在這裏插入圖片描述
執行打包在這裏插入圖片描述
等待完成後,在相應的目錄下就可以看到EXE文件及相關配件信息
在這裏插入圖片描述.
.exe在dist中

PyInstaller 支持的常用選項

指令 作用
-F,-onefile 產生單個的可執行文件
-D,–onedir 產生一個目錄(包含多個文件)作爲可執行程序
-a,–ascii 不包含 Unicode 字符集支持
-d,–debug 產生 debug 版本的可執行文件
-w,–windowed,–noconsolc 指定程序運行時不顯示命令行窗口(僅對 Windows 有效)
-c,–nowindowed,–console 指定使用命令行窗口運行程序(僅對 Windows 有效)
-o DIR,–out=DIR 指定 spec 文件的生成目錄。如果沒有指定,則默認使用當前目錄來生成 spec 文件
-p DIR,–path=DIR 設置 Python 導入模塊的路徑(和設置 PYTHONPATH 環境變量的作用相似)。也可使用路徑分隔符(Windows 使用分號,Linux 使用冒號)來分隔多個路徑
-n NAME,–name=NAME 指定項目(產生的 spec)名字。如果省略該選項,那麼第一個腳本的主文件名將作爲 spec 的名字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章