一. 界面設計
登錄預覽:
圖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-8
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtGui import QMouseEvent
from PyQt5 import Qt
import ui_login
class 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 sys
from PyQt5.QtWidgets import QApplication
import Login
if __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 運行界面
2.5 為按鈕添加響應事件
與Qt一樣,PyQt5使用“信號和槽”來作為通信機制
2.5.1 為取消按鈕添加事件
定義槽:
def onCancleClicked(self):
self.close()
在__init()__中添加連接“信號和槽”:
def __init__(self):
super().__init__()
self.setupUi(self)
self.mBtnCancel.clicked.connect(self.onCancleClicked)
以上代碼實現點擊取消按鈕程序退出
2.5.2 為登錄按鈕添加事件
定義槽:
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-8
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from PyQt5.QtGui import QMouseEvent
from PyQt5 import Qt
import ui_login
class 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文件夾顯示時的圖標。
閱讀更多 小小邁克 的文章