PySide2基礎篇(十二)——QMenuBar和QMenu運用
前言:
閱讀這篇文章我能學到什麼?
每個對話框都可以設置一個菜單欄,菜單欄是分類管理按鈕的最佳控件。請閱讀這篇文章學學。
——如果你覺得這是一篇不錯的博文,希望你能給一個小小的贊,感謝您的支持。
1 創建菜單欄和添加菜單項
我們嘗試對主對話框添加菜單欄,併爲菜單欄中添加菜單項。
代碼示例:
from PySide2.QtWidgets import QApplication, QMainWindow, QMenuBar, QMenu
app = QApplication([])
MainWindow = QMainWindow()
MenuBar = MainWindow.menuBar() #獲取主對話框的菜單欄
MenuBar.resize(100, 20)
MenuA = MenuBar.addMenu("MenuA") #給MenuBar添加菜單
MenuA1 = MenuA.addMenu("A1") #菜單嵌套子菜單
MenuA1.addAction("A1a")
MenuA1.addAction("A1b")
ActionA2 = MenuA.addAction("A2") #菜單添加Action
MenuB = MenuBar.addMenu("MenuB")
MenuB1 = MenuB.addMenu("B1")
MenuB1.addAction("B1a")
MenuB1.addAction("B1b")
MenuB.addAction("B2")
MainWindow.show()
app.exec_()
運行結果:
操作的過程爲首先給對話框創建QMenuBar
,然後給其添加QMenu
或直接添加QAction
,QMenu
又可繼續嵌套添加QMenu
或QAction
,總是QMenu
是用來選擇的,真正點擊的是QAction
。
2 對QMenuBar的其他操作
2.1 添加圖標
與其他空間類似,QMenu
可以顯示圖標同時顯示文本,但QMenuBar
下的第一級QMenu
添加圖標後將不顯示文本。
代碼示例:
from PySide2.QtWidgets import QApplication, QMainWindow, QMenuBar, QMenu
from PySide2.QtGui import QIcon
app = QApplication([])
MainWindow = QMainWindow()
Icon = QIcon(".\png\Icon.ico")
MenuBar = MainWindow.menuBar() #獲取主對話框的菜單欄
MenuBar.resize(100, 20)
MenuA = MenuBar.addMenu("MenuA") #給MenuBar添加菜單,MenuA文本將不會顯示
MenuA.setIcon(Icon)
MenuA1 = MenuA.addMenu("A1") #菜單嵌套子菜單
MenuA1.setIcon(Icon)
ActionA1a = MenuA1.addAction("A1a")
ActionA1a.setIcon(Icon)
ActionA1b = MenuA1.addAction("A1b")
ActionA1b.setIcon(Icon)
ActionA2 = MenuA.addAction("A2") #菜單添加Action
ActionA2.setIcon(Icon)
MainWindow.show()
app.exec_()
運行結果:
2.2 給QMenu添加分割線
在添加的QMenu
項之後可以調用addSeparator()
添加分割線,顯示效果與添加的順序有關係。
代碼示例:
from PySide2.QtWidgets import QApplication, QMainWindow, QMenuBar, QMenu
from PySide2.QtGui import QIcon
app = QApplication([])
MainWindow = QMainWindow()
Icon = QIcon(".\png\Icon.ico")
MenuBar = MainWindow.menuBar() #獲取主對話框的菜單欄
MenuBar.resize(100, 20)
MenuA = MenuBar.addMenu("MenuA") #給MenuBar添加菜單,MenuA文本將不會顯示
MenuA.setIcon(Icon)
MenuA1 = MenuA.addMenu("A1") #菜單嵌套子菜單
MenuA1.setIcon(Icon)
MenuA.addSeparator() #添加分割線
ActionA1a = MenuA1.addAction("A1a")
ActionA1a.setIcon(Icon)
MenuA1.addSeparator() #添加分割線
ActionA1b = MenuA1.addAction("A1b")
ActionA1b.setIcon(Icon)
ActionA1c = MenuA1.addAction("A1c")
ActionA1c.setIcon(Icon)
ActionA2 = MenuA.addAction("A2") #菜單添加Action
ActionA2.setIcon(Icon)
MainWindow.show()
app.exec_()
運行結果:
3 添加點擊事件
需要注意的是QMenu
只是顯示分支,最終點擊選擇的是QAction
。給QMenu
添加點擊事件時,該QMenu
下的任一QAction
被點擊都會觸發點擊事件。QAction也可以添加點擊事件。
代碼示例:
from PySide2.QtWidgets import QApplication, QMainWindow, QMenuBar, QMenu
from PySide2.QtCore import Slot
app = QApplication([])
MainWindow = QMainWindow()
MenuBar = MainWindow.menuBar() #獲取主對話框的菜單欄
MenuBar.resize(100, 20)
MenuA = MenuBar.addMenu("MenuA") #給MenuBar添加菜單
MenuA1 = MenuA.addMenu("A1") #菜單嵌套子菜單
ActionA1a = MenuA1.addAction("A1a") #菜單項添加Action
ActionA1b = MenuA1.addAction("A1b")
ActionA2 = MenuA.addAction("A2")
@Slot()
def ClickMenuBar():
print("Click MenuBar")
@Slot()
def ClickMenuA():
print("Click MenuA")
@Slot()
def ClickMenuA1():
print("Click MenuA1")
@Slot()
def ClickMenuA1a():
print("Click MenuA1a")
@Slot()
def ClickMenuA1b():
print("Click MenuA1b")
@Slot()
def ClickMenuA2():
print("Click MenuA2")
MenuBar.triggered.connect(ClickMenuBar) #給菜單欄添加點擊事件
MenuA.triggered.connect(ClickMenuA) #給菜單A添加點擊事件
MenuA1.triggered.connect(ClickMenuA1) #給菜單A1添加點擊事件
ActionA2.triggered.connect(ClickMenuA2) #給ActionA2添加點擊事件
ActionA1a.triggered.connect(ClickMenuA1a) #給ActionA1a添加點擊事件
ActionA1b.triggered.connect(ClickMenuA1b) #給ActionA1b添加點擊事件
MainWindow.show()
app.exec_()
運行結果:
需要注意這裏事件響應的順序。QMenu
嵌套時優先響應子層的點擊事件。QMenu
下的點擊事件和QAction
點擊事件,會優先響應QMenu
點擊事件後響應QAction
點擊事件。