前言
在做一個數據分析的桌面端程序遇到一些問題,這里簡單整理下,分享出來供使用者參考。
1、網上查使用PyQt5工具欄的示例,發現很多只是一個簡單的退出功能,如果有幾個按鈕如何處理?如何區分點擊的究竟是哪個按鈕?
2、使用Eric6開發的界面,實行的是界面和代碼分離,那么在桌面端項目應用中如何集成到一起?
軟件環境:
Python 3.5+Eric6+PyQt5
OS:Windows
項目需求:
1、點擊菜單項,打開一個新窗體
2、點擊工具欄上的某一按鈕,打開相應的窗體
3、點擊某一個菜單項,打開相應的窗體
設計:
作為示例,這里命名菜單項:
主菜單項:File、Help
子菜單項:New 、Open、Save、Exit
工具欄項:New、Open、Save
參考步驟:
1、准備,這里假定開發環境已經搭建、配置好了。
2、建立項目文件夾:PyQt5_Test1
在這個文件夾里,再放一個images文件夾,里面放一些作為圖標文件的png文件
下載圖標文件,可從下面網址下載:
http://www.easyicon.net
3、建立項目
啟動Eric6,點頂端菜單項Project,點New,如下圖,設置Project Name,PyQt5_Test1,點2處的圖標按鈕,選擇項目文件夾,點OK按鈕
4、系統會提示是否增加已有文件,因為是新建項目,沒有待增加的文件,所以點No即可
剛建好的項目如下,系統自動生成一個_init_.py空文件
5、創建主窗體
點圖標,選擇窗體頁簽,點鼠標右鍵,點選New form菜單項
6、form type 選擇Main Window
7、文件名命名為:QMainWindow,點保存按鈕
8、至此,會進入Qt 設計師,鼠標點中窗體中見,點鼠標右鍵,分別點選“創建菜單欄”和“添加工具欄”菜單項
3、增加菜單項
一級菜單項:File
二級菜單項:New、Open、Save、Exit
在建立菜單項的時候,給菜單項命名,在右側的屬性編輯器里分別命名為actionNew、actionOpen、actionSave、actionExit
在Exit菜單項上面增加一個分隔符
點選Exit菜單項,點鼠標右鍵,再點選插入分隔符
9、給菜單項增加圖標,以增加美觀
選種某個菜單項,在右面的屬性編輯器里,找到icon這一行,點右側的下拉三角圖標,選擇images里的png圖標文件
10、比照前面的增加菜單的方式,增加Help菜單項
11、工具欄的設計,在Qt 設計師里,不能像菜單欄那樣直接增加,可在代碼里添加,點鼠標右鍵,點添加“工具欄”
在窗體頂部會增加一個工具欄的橫條,如下圖
12、在Qt 設計師里,點頂部的菜單保存按鈕
13、上面設計好了主窗體,下面再分別增加幾個子窗體,在點擊菜單項的時候,我們這里只是打開一個相應的新窗體,圍繞着前面前言里講的問題和項目需求進行講解,不再往下拓展后續功能的實現。
參照前面第5步,點窗體標簽,點New form,form type選擇Widget,前面第5步建立主窗體選擇的是MainWindow
文件命名為NewForm,點保存按鈕
從左側工具欄,拖一個按鈕到窗體界面上,在右側的屬性編輯器,objectName命名為btn_Exit,text命名為Exit,icon從images里選擇btn_Exit.png圖標
點Qt 設計師頂部的保存按鈕,關閉Qt設計師
14、參照上面這一步,分別建立子窗體OpenForm、SaveForm、HelpForm、AboutForm
建好以后,窗體界面文件如下:
前面是窗體界面設計,下面開始代碼編輯
15、首先選中QMainWindow.ui文件,點鼠標右鍵,點選Generate Dialog code
如下圖,點className右面的New ,給className命名為MainWindow,生成的文件名為:QMainWindow.py
給每一個菜單項綁定槽函數,勾選on_actionXXX_triggered()
16、給子窗體綁定槽函數
以NewForm為例,點選NewForm.ui,點選generate Dialog Code,點New按鈕,默認的className為Form,更改為NewForm,點OK 按鈕
綁定槽函數,勾選on_btn_Exit_clicked()
17、參照上一步分別點選OpenForm.ui、SaveForm.ui、HelpForm.ui、AboutForm.ui,點選Generate Dialog Code,創建類文件,並分別勾選槽函數
18、從ui文件轉化生成py界面文件,點中任一個ui文件,比如QMainWindow.ui,點鼠標右鍵,編譯,點Compile all files。
如果是單個文件,則點選compile form菜單項。如果修改了某個界面ui文件,則重新編譯,以更新生成的界面文件
切換到代碼頁,點頁簽,則可以看到系統生成了對應的ui_xxxxxx.py文件
在系統運行中,運行的是這些xxx.py文件,而不包括xxx.ui文件
19.本項目的入口文件是QMainWindow.py,雙擊打開QMainWindow.py,開始編輯
1)、把from .Ui_QMainWindow import Ui_MainWindow這一句Ui前面的點“.”去掉
from Ui_QMainWindow import Ui_MainWindow
2)、注釋掉各個槽函數里的raise NotImplementedError
3)、由於本項目是從QMainWindow.py啟動,所以,需要實例化窗體類,增加下面代碼
if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) mainForm = MainWindow() mainForm.show() sys.exit(app.exec_())
4)、導入模塊QWidgets
from PyQt5 import QtWidgets
5)、增加導入模塊QMessageBox
from PyQt5.QtWidgets import QMainWindow, QAction, QMessageBox
6)、給菜單項Exit的槽函數里增加退出系統的代碼
@pyqtSlot() def on_actionExit_triggered(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError print("Click Menu Exit") reply = QMessageBox.question(self, "標題", "確定要退出系統嗎?", QMessageBox.Yes|QMessageBox.No) if reply == QMessageBox.Yes: sys.exit(0)
7)、試運行,點頂部工具欄里的運行圖標
注意下圖中路徑和文件名是否正確,不正確則需修改
試運行結果如下:
20、點擊菜單項,打開相應的子窗體
點擊每一個子菜單項,打開一個子窗體,
A、編輯子窗體的業務邏輯代碼
B、需在QMainWindow.py里進行下面三步:
1)、導入子窗體的業務邏輯代碼
2)、實例化子窗體類
3)、編輯連接菜單項的槽函數
以打開NewForm為例
21、雙擊打開NewForm.py
1)、把from .Ui_NewForm import Ui_Form里Ui前的點去掉
2)、注釋掉槽函數里的raise NotImplementedError
3)、給按鈕Exit增加代碼
self.close()
22、編輯QMainWindow.py,雙擊打開
1)、導入NewForm模塊
2)、實例化NewForm子窗體類
3)、編輯槽函數
@pyqtSlot() def on_actionNew_triggered(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError subForm1.show()
試運行,結果如下:
23、參照第21、22步,分別編輯OpenForm.py、SaveForm.py、HelpForm.py、AboutForm.py,然后編輯QMainWindow.py,以點擊按鈕打開相應子窗體
24、增加工具欄按鈕
1)導入QAction,QIcon模塊
from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QMainWindow, QMessageBox , QAction from PyQt5 import QtWidgets from PyQt5.QtGui import QIcon
2)、在 def __init__(self, parent=None):里進行編輯
def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(MainWindow, self).__init__(parent) self.setupUi(self) #工具欄 # 添加打開tool 在pyqt5里面是一個action tb1 = QAction(QIcon("./images/menuNew.png"), "New", self) self.toolBar.addAction(tb1) tb2 = QAction(QIcon("./images/MenuOpen.png"), "Open", self) self.toolBar.addAction(tb2) tb3 = QAction(QIcon("./images/MenuSave.png"), "Save", self) self.toolBar.addAction(tb3)
其中toolBar對應的是窗體界面文件MainWindow.ui里添加的工具欄的對象名稱,如果工具欄的對象名稱修改了,那么上面代碼里self.toolBar中的toolBar也要相應更新
運行過以后如下圖:
3)、增加點擊不同工具欄按鈕,打開相應窗體的代碼
增加自定義的槽函數
def toolBtnPressed(self,qaction): print("pressed too btn is",qaction.text()) if qaction.text()=="New": print("Click ToolBar New Button") subForm1.show() subForm1.InitForm() elif qaction.text()=='Open': print("Click ToolBar Open Button") subForm2.show() subForm2.InitForm() elif qaction.text()=='Save': print("Click ToolBar Save Button") subForm3.show() subForm3.InitForm()
建立與槽函數的連接,在 def __init__(self, parent=None):里增加下面代碼
#連接槽函數 self.toolBar.actionTriggered[QAction].connect(self.toolBtnPressed)
25、增加狀態欄
1)、打開MainWindow.ui,點鼠標右鍵,增加狀態欄
2)、在QMainWindow.py的 def __init__(self, parent=None):里增加下面代碼:
#狀態欄 self.statusBar.showMessage('XXXXXX Support')
附件:
本項目代碼上傳到了百度網盤:
鏈接: https://pan.baidu.com/s/1e-ho9k6vdk-0Hw9VkIAbKA 提取碼:7j2v