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
点击事件。