【PyQt】工具栏(QToolBar)与动作按钮(QAction)使用指南

PyQt工具栏(QToolBar)与动作按钮(QAction)使用指南 ️

一、基础用法示例

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 创建工具栏 
        self.toolbar = self.addToolBar("主工具栏")
        
        # 创建动作集合 
        self._create_actions()
        
        # 设置工具栏图标尺寸 
        self.toolbar.setIconSize(QSize(32, 32))

    def _create_actions(self):
        # 新建文件动作 
        self.new_action = QAction(QIcon("icons/new.png"), "新建", self)
        self.new_action.setShortcut("Ctrl+N")
        self.new_action.setStatusTip("创建新文件")
        self.new_action.triggered.connect(self.new_file)
        self.toolbar.addAction(self.new_action)
        
        # 添加分隔符 ➖
        self.toolbar.addSeparator()
        
        # 保存文件动作 
        self.save_action = QAction(QIcon("icons/save.png"), "保存", self)
        self.save_action.setShortcut("Ctrl+S")
        self.save_action.triggered.connect(self.save_file)
        self.toolbar.addAction(self.save_action)

二、完整功能实现

class AdvancedToolbarDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        # 创建多个工具栏 
        self.file_toolbar = self.addToolBar("文件")
        self.edit_toolbar = self.addToolBar("编辑")
        
        # 初始化动作 
        self.init_actions()
        
        # 添加工具栏控件 ️
        self.add_tool_widgets()
        
    def init_actions(self):
        # 打开文件动作 
        self.open_action = QAction(QIcon("icons/open.png"), "打开文件", self)
        self.open_action.setShortcut("Ctrl+O")
        self.open_action.triggered.connect(self.open_file)
        self.file_toolbar.addAction(self.open_action)
        
        # 打印动作 ️
        self.print_action = QAction(QIcon("icons/print.png"), "打印", self)
        self.print_action.setEnabled(False)  # 初始禁用
        self.print_action.triggered.connect(self.print_document)
        self.file_toolbar.addAction(self.print_action)
        
        # 撤销/重做动作 
        self.undo_action = QAction(QIcon("icons/undo.png"), "撤销", self)
        self.undo_action.triggered.connect(self.undo)
        self.edit_toolbar.addAction(self.undo_action)
        
        self.redo_action = QAction(QIcon("icons/redo.png"), "重做", self)
        self.redo_action.triggered.connect(self.redo)
        self.edit_toolbar.addAction(self.redo_action)
        
    def add_tool_widgets(self):
        # 添加组合框 
        self.font_combo = QFontComboBox()
        self.edit_toolbar.addWidget(self.font_combo)
        
        # 添加颜色选择按钮 
        self.color_btn = QToolButton()
        self.color_btn.setPopupMode(QToolButton.MenuButtonPopup)
        color_menu = QMenu(self)
        color_menu.addAction("红色", lambda: self.set_color(Qt.red))
        color_menu.addAction("蓝色", lambda: self.set_color(Qt.blue))
        self.color_btn.setMenu(color_menu)
        self.color_btn.setIcon(QIcon("icons/color.png"))
        self.edit_toolbar.addWidget(self.color_btn)
        
        # 添加切换按钮 
        self.grid_toggle = QAction(QIcon("icons/grid.png"), "显示网格", self)
        self.grid_toggle.setCheckable(True)
        self.grid_toggle.toggled.connect(self.toggle_grid)
        self.edit_toolbar.addAction(self.grid_toggle)

三、关键功能说明

  1. 图标设置
action.setIcon(QIcon("path/to/icon.png"))
  1. 快捷键绑定 ⌨️
action.setShortcut("Ctrl+Shift+S")
  1. 状态提示
action.setStatusTip("保存当前文件")
  1. 启用/禁用控制 ⚙️
action.setEnabled(False)  # 禁用按钮
  1. 可检查状态
action.setCheckable(True)
action.toggled.connect(handler)

四、高级技巧

  1. 上下文菜单
def contextMenuEvent(self, event):
    menu = QMenu(self)
    menu.addAction(self.new_action)
    menu.addAction(self.save_action)
    menu.exec_(event.globalPos())
  1. 工具栏定位
# 停靠位置设置
self.addToolBar(Qt.LeftToolBarArea, self.file_toolbar)
self.addToolBar(Qt.RightToolBarArea, self.edit_toolbar)

# 浮动控制
self.file_toolbar.setFloatable(False)  # 禁止浮动
  1. 工具栏样式
# 设置工具按钮样式
self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

# 自定义样式表
self.toolbar.setStyleSheet("""
    QToolBar { background: #f0f0f0; }
    QToolButton { padding: 5px; }
""")

五、注意事项 ⚠️

  1. 图标资源
    建议使用Qt资源系统(qrc文件)管理图标,避免路径问题

  2. 快捷键冲突 ⚔️
    使用QShortcut类管理全局快捷键

  3. 工具栏灵活性
    允许用户通过setMovable(True)自定义工具栏位置

  4. 状态保存
    使用QSettings保存工具栏布局:

settings = QSettings("MyCompany", "MyApp")
settings.setValue("toolbarState", self.saveState())

你可能感兴趣的:(pyqt,python,开发语言)