菜單由menu bar菜單欄和menu菜單兩部分構成,分別對應類QMenuBar和QMenu。
menuBar是包含一系列下拉菜單項組成,menu包含兩種,一種是直接對應Action的,一種是父菜單,下面的子菜單對應Action,在此稱對應了Action的菜單為菜單項(這個稱呼可能與菜單項的標准說法不一致)。
1、菜單欄及菜單的界面定義操作
在Qt Designer中,如果主窗口無菜單通過在主窗口中鼠標右鍵的彈出菜單可以給主窗口創建菜單欄,如圖:
如果已經創建菜單欄,通過鼠標右鍵點擊菜單條的彈出菜單可以刪除菜單,如圖:
菜單欄創建后,就可以通過直接鼠標點擊菜單欄后通過鍵盤輸入菜單名回車后創建菜單,並用同樣的方法創建子菜單。
菜單的創建還有一種方法就是直接拖拽Action到菜單中,就會直接生成菜單項。
2、菜單QMenu的信號
菜單除了通過Action的信號連接槽函數外,也可以通過菜單自身的信號連接槽函數,只是菜單自身的信號不是基於菜單項的,而是基於菜單項的父菜單QMenu類的。有如下信號:
- aboutToHide()信號:當菜單隱藏前觸發
- aboutToShow()信號:當菜單展示前觸發
- hovered(QAction *action)信號:鼠標停留在菜單項上面時觸發
- triggered(QAction *action)信號:當菜單項對應的Action被觸發時觸發。
以上4個信號經老猿驗證,在Qt Designer中設計好信號和槽函數連接后,通過PyUIC生成的代碼並沒有建立連接的代碼。只有自己在派生類的構造方法中增加建立信號和槽函數連接的代碼才可以。以下是老猿在派生類的構造方法添加的QMenu信號和槽函數連接的代碼案例:
self.menusystem.triggered['QAction*'].connect(self.menuSystemTrigger)
self.menusystem.aboutToHide.connect(self.menuHide)
self.menusystem.aboutToShow.connect(self.menuShow)
QtCore.QMetaObject.connectSlotsByName(self)
3、菜單欄QMenuBar的信號
QMenuBar菜單欄主要有2個信號:
- hovered((QAction *action)信號:當鼠標懸停在任何一個菜單欄下的菜單項關聯的Action對應的菜單項或工具欄按鈕時觸發,觸發時先觸發各Action的hovered()信號,再觸發QMenuBar的hovered()信號
- triggered(QAction *action)信號:菜單下面的任何一個菜單項(即Action)被觸發時觸發,請參考Action的triggered()信號。
以上兩個信號在Action和menu中都存在,使用菜單欄的信號來觸發這種情況,一般是在開發者不想將槽函數對應到每個菜單項而是對應到父菜單時使用,但這樣在槽函數中就需要判斷具體是哪個菜單項被觸發。
以上二個信號可以在Qt Designer中直接進行槽函數連接並使用PyUIC生成代碼。