一. 介面設計
登入預覽:
圖1.1 設計介面
二. 生成PyQt5程式碼2.1 環境
為了使用PyQt5,需要安裝PyQt5模組,這裡使用pip進行安裝:
pip3 install PyQt5
PyQt5安裝完成之後,就可以執行.py檔案了。為了方便打包檔案成獨立的可執行檔案,還需要安裝pyinstaller,使用pip安裝即可:
pip3 install pyinstaller
以上環境基於window,Python版本為3.6.2
注:使用pip3安裝只支援Python3.5往後的版本,如果使用使用2.x版本的python,需要下載原始碼進行安裝
2.2 生成.py模組
這個步驟與Qt的qmake命令一樣,根據ui檔案生成對應的原始碼檔案,除了ui檔案,.qrc檔案同樣需要轉為.py模組
1. 轉換.ui為檔案為.py檔案,可以使用pyuic5命令來轉換檔案:
pyuic5 login.ui -o ui_login.py
-o ui_login.py表示輸出到ui_login.py檔案,如果沒有-o引數,將會列印python程式碼到控制檯。
資原始檔(.qrc)使用pyrcc5命令來轉換:
pyrcc5 qtdesigner.qrc -o qtdesigner_rc.py
轉換資原始檔,對檔名有命名規則:主檔名_rc.py。其中主檔名必須是.qrc的主檔名,否則在執行python檔案的時候出現qtdesigner_rc模組找不到的問題。
2.3 擴充套件Ui_LoginDialog類
生成python程式碼後,需要把Ui_LoginDialog類與QMainWindow類繫結在一起(注:在設計登入介面時使用的是QMainWindow,因此在擴充套件時也需要使用QMainWindow), Login.py檔案內容如下:
# coding:utf-8from PyQt5.QtWidgets import QMainWindowfrom PyQt5.QtGui import QMouseEventfrom PyQt5 import Qtimport ui_loginclass LoginDialog(QMainWindow, ui_login.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self)
以上程式碼中,定義了一個LoginDialog類,這個類擴充套件了QMainWindow類以及ui_login.Ui_MainWindow,QMainWindow類是QtPy5提供的窗體類,ui_login.Ui_MainWindow則是使用pyuic5命令生成的介面類。程式碼self.setupUi(self)功能與C++版本的Qt一樣。
2.4 啟動介面
以上几上步驟僅僅是將介面類封裝了,還沒有啟動介面的地方,這裡使用app.py檔案來作為程式入口:
import sysfrom PyQt5.QtWidgets import QApplicationimport Loginif __name__ == '__main__': app = QApplication(sys.argv) win = Login.LoginDialog() win.show() sys.exit(app.exec_())app = QApplication(sys.argv):Qt程式的常規啟動操作 win = Login.LoginDialog():建立登入視窗 win.show():顯示視窗 sys.exit(app.exec_()):執行app
從以上四行程式碼可以看出,PyQt5開發的程式碼與Qt開發的程式碼有驚人的相似之處。
直接執行python app.py即可啟動
圖2.4.1 執行介面
與Qt一樣,PyQt5使用“訊號和槽”來作為通訊機制
定義槽:
def onCancleClicked(self): self.close()
在__init()__中新增連線“訊號和槽”:
def __init__(self): super().__init__() self.setupUi(self) self.mBtnCancel.clicked.connect(self.onCancleClicked)
以上程式碼實現點選取消按鈕程式退出
定義槽:
def onLoginClicked(self): name = self.mTextUserName.text() passwd = self.mTextPassword.text() QMessageBox.information(None, "登入提示", "使用者名稱:" + name + "密碼:" + passwd, QMessageBox.Ok, QMessageBox.Ok)
在__init()__中新增連線“訊號和槽”:
def __init__(self): super().__init__() self.setupUi(self) self.mBtnCancel.clicked.connect(self.onCancleClicked) self.mBtnLogin.clicked.connect(self.onLoginClicked)
點選登入按鈕,彈出對話方塊。
2.6 Login.py完整程式碼如下
# coding:utf-8from PyQt5.QtWidgets import QMainWindow, QMessageBoxfrom PyQt5.QtGui import QMouseEventfrom PyQt5 import Qtimport ui_loginclass LoginDialog(QMainWindow, ui_login.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.setWindowFlag(Qt.Qt.FramelessWindowHint) # 隱藏視窗標題欄 self.mDragWindow = False self.mMousePoint = [] self.mBtnCancel.clicked.connect(self.onCancleClicked) self.mBtnLogin.clicked.connect(self.onLoginClicked) def mouseMoveEvent(self, event): e = QMouseEvent(event) if self.mDragWindow: self.move(e.globalPos() - self.mMousePoint) e.accept() def mousePressEvent(self, event): e = QMouseEvent(event) if e.button() == Qt.Qt.LeftButton: self.mMousePoint = e.globalPos() - self.pos() self.mDragWindow = True e.accept() def mouseReleaseEvent(self, event): self.mDragWindow = False def onLoginClicked(self): name = self.mTextUserName.text() passwd = self.mTextPassword.text() QMessageBox.information(None, "登入提示", "使用者名稱:" + name + "密碼:" + passwd, QMessageBox.Ok, QMessageBox.Ok) def onCancleClicked(self): \t\t\t\t self.close()
self.setWindowFlag(Qt.Qt.FramelessWindowHint)可以把窗體的標題欄隱藏掉,為移動窗體,需要新增額外的程式碼:
def mouseMoveEvent(self, event): e = QMouseEvent(event) if self.mDragWindow: self.move(e.globalPos() - self.mMousePoint) e.accept() def mousePressEvent(self, event): e = QMouseEvent(event) if e.button() == Qt.Qt.LeftButton: self.mMousePoint = e.globalPos() - self.pos() self.mDragWindow = True e.accept() def mouseReleaseEvent(self, event): self.mDragWindow = False
以上三個函式都是PyQt5的事件,在LoginDialog類中重寫了這三個函式,以實現無標題欄窗體的拖動功能。
圖2.6.1 無標題的登入介面:
三. 打包
在windows下,可以打包成.exe檔案:
pyinstaller -F -w app.py Login.py ui_login.py qtdesigner_rc.py --icon=app.ico-F:表示打包成單一檔案 -w:使用視窗模式,如果沒有這個選項,生成的exe檔案啟動時全帶有命令列視窗 --icon=app.ico:設定應用程式的圖示,該圖示與窗體的上圖示是區別的,此圖示是在windows資料夾顯示時的圖示。