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)
三、关键功能说明 🔑
- 图标设置 🖼️
action.setIcon(QIcon("path/to/icon.png"))
- 快捷键绑定 ⌨️
action.setShortcut("Ctrl+Shift+S")
- 状态提示 💡
action.setStatusTip("保存当前文件")
- 启用/禁用控制 ⚙️
action.setEnabled(False) # 禁用按钮
- 可检查状态 ✅
action.setCheckable(True)
action.toggled.connect(handler)
四、高级技巧 🚀
- 上下文菜单 🖱️
def contextMenuEvent(self, event):
menu = QMenu(self)
menu.addAction(self.new_action)
menu.addAction(self.save_action)
menu.exec_(event.globalPos())
- 工具栏定位 🧭
# 停靠位置设置
self.addToolBar(Qt.LeftToolBarArea, self.file_toolbar)
self.addToolBar(Qt.RightToolBarArea, self.edit_toolbar)
# 浮动控制
self.file_toolbar.setFloatable(False) # 禁止浮动
- 工具栏样式 🎨
# 设置工具按钮样式
self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
# 自定义样式表
self.toolbar.setStyleSheet("""
QToolBar { background: #f0f0f0; }
QToolButton { padding: 5px; }
""")
五、注意事项 ⚠️
-
图标资源 📁
建议使用Qt资源系统(qrc文件
)管理图标,避免路径问题 -
快捷键冲突 ⚔️
使用QShortcut
类管理全局快捷键 -
工具栏灵活性 🧩
允许用户通过setMovable(True)
自定义工具栏位置 -
状态保存 💾
使用QSettings
保存工具栏布局:
settings = QSettings("MyCompany", "MyApp")
settings.setValue("toolbarState", self.saveState())