PyQt5+Eric6開發的一個使用菜單欄、工具欄和狀態欄的示例


前言

     在做一個數據分析的桌面端程序遇到一些問題,這里簡單整理下,分享出來供使用者參考。

     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

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM