PySide6-QWidget-Menus


前言:菜单体系的继承关系澄清

在 PySide6 的菜单与工具栏架构中:


第一部分:QAction —— 动作的抽象基类

导入from PySide6.QtGui import QAction
QAction 是菜单项、工具栏按钮背后的灵魂。无论是添加到菜单还是工具栏,实际上都是在操作同一个 QAction 对象。

🟢 QAction 的核心信号


第二部分:QActionGroup —— 动作互斥分组(进阶)

导入from PySide6.QtGui import QActionGroup
如果有多项动作需要在同一时间只允许选中一个(比如菜单里的“左对齐”、“居中”、“右对齐”),直接使用 QActionGroup 即可。

🟢 QActionGroup 的核心信号


第三部分:QMenuBar —— 菜单栏容器

导入from PySide6.QtWidgets import QMenuBar
菜单栏通常位于 QMainWindow 的顶部。


第四部分:QMenu —— 下拉菜单

导入from PySide6.QtWidgets import QMenu
代表一个下拉的菜单列表,内部可以包含动作、子菜单和分割线。

🟢 QMenu 的核心信号


第五部分:QToolBar —— 工具栏

导入from PySide6.QtWidgets import QToolBar
工具栏通常位于菜单栏下方或四周,用于放置高频率操作的快捷按钮。

🟢 QToolBar 的核心信号


第六部分:QToolButton 与菜单的结合(补充细节)

导入from PySide6.QtWidgets import QToolButton
虽然 QToolButton 属于基础控件家族,但它与菜单结合的应用非常广泛。


第七部分:实战模板(右键菜单与工具栏组合)

演示如何在一个 QMainWindow 中完美结合上述所有元素。

from PySide6.QtWidgets import (QMainWindow, QTextEdit, QToolBar, QMenu, 
                               QToolButton, QApplication, QWidget, QVBoxLayout)
from PySide6.QtGui import QAction, QIcon
from PySide6.QtCore import Qt

class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("菜单与工具栏演示")
        
        # 中央部件
        text_edit = QTextEdit()
        self.setCentralWidget(text_edit)
        
        # 1. 菜单栏与动作
        menubar = self.menuBar()
        file_menu = menubar.addMenu("文件")
        
        new_act = QAction(QIcon("new.png"), "新建", self)
        new_act.setShortcut("Ctrl+N")
        new_act.triggered.connect(lambda: print("新建文件"))
        file_menu.addAction(new_act)
        
        exit_act = QAction("退出", self)
        exit_act.setShortcut("Ctrl+Q")
        exit_act.triggered.connect(self.close)
        file_menu.addAction(exit_act)
        
        # 2. 工具栏
        toolbar = QToolBar("主工具栏")
        self.addToolBar(toolbar)
        toolbar.addAction(new_act)
        toolbar.addSeparator()
        toolbar.addAction(exit_act)
        
        # 工具栏中添加下拉按钮
        tool_btn = QToolButton(toolbar)
        tool_btn.setText("导出")
        tool_btn.setPopupMode(QToolButton.MenuButtonPopup)
        exp_menu = QMenu(tool_btn)
        exp_menu.addAction("导出为 PDF")
        exp_menu.addAction("导出为 TXT")
        tool_btn.setMenu(exp_menu)
        toolbar.addWidget(tool_btn)
        
        # 3. 实现全局右键菜单(上下文菜单)
        # 需要 setContextMenuPolicy(Qt.CustomContextMenu) 和连接信号
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.open_context_menu)
        
    def open_context_menu(self, pos):
        # 在鼠标屏幕坐标位置弹出菜单
        context_menu = QMenu(self)
        context_menu.addAction("撤销")
        context_menu.addAction("重做")
        context_menu.exec(self.mapToGlobal(pos))

if __name__ == "__main__":
    app = QApplication([])
    window = MyMainWindow()
    window.show()
    app.exec()

第八部分、 菜单与工具栏体系的高阶隐藏细节补充

QAction 补充细节

QMenu 补充细节

QToolBar 补充细节


PySide6-QWidget-Menus
第一部分:QAction —— 动作的抽象基类
第二部分:QActionGroup —— 动作互斥分组(进阶)
第四部分:QMenu —— 下拉菜单
第五部分:QToolBar —— 工具栏
第八部分、 菜单与工具栏体系的高阶隐藏细节补充