PyQt5:使用QT設計師設計界面

一. 界面設計

登錄預覽:

圖1.1 設計界面

PyQt5:使用QT設計師設計界面

二. 生成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_())
  1. app = QApplication(sys.argv):Qt程序的常規啟動操作
  2. win = Login.LoginDialog():創建登錄窗口
  3. win.show():顯示窗口
  4. sys.exit(app.exec_()):執行app

從以上四行代碼可以看出,PyQt5開發的代碼與Qt開發的代碼有驚人的相似之處。

直接執行python app.py即可啟動

圖2.4.1 運行界面

PyQt5:使用QT設計師設計界面

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 無標題的登錄界面:

PyQt5:使用QT設計師設計界面

三. 打包

在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文件夾顯示時的圖標。


分享到:


相關文章: