首頁>技術>

一. 介面設計

登入預覽:

圖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資料夾顯示時的圖示。

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • .NET基礎:應用程式域AppDomain