PyQt QToolBar 小部件详解

 QToolBar 是 PyQt 中用于创建工具栏的控件,它提供了一种快速访问常用功能的界面元素。工具栏通常位于菜单栏下方或窗口边缘,包含图标按钮、下拉菜单和其他控件。

基本用法示例

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QToolBar, QAction, 
                             QPushButton, QComboBox, QLineEdit, QLabel, 
                             QStatusBar, QTextEdit, QStyle)
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtCore import Qt, QSize

class ToolbarDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QToolBar 示例")
        self.setGeometry(300, 300, 800, 600)
        
        # 创建中央部件
        self.text_edit = QTextEdit()
        self.setCentralWidget(self.text_edit)
        
        # 创建状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage("就绪")
        
        # 创建工具栏
        self.create_toolbars()
    
    def create_toolbars(self):
        # 1. 主工具栏
        main_toolbar = self.addToolBar("主工具栏")
        main_toolbar.setMovable(True)  # 允许移动
        main_toolbar.setIconSize(QSize(24, 24))  # 设置图标大小
        
        # 新建动作
        new_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_FileIcon)), "新建", self)
        new_action.setShortcut(QKeySequence.New)
        new_action.setStatusTip("创建新文件")
        new_action.triggered.connect(self.new_file)
        main_toolbar.addAction(new_action)
        
        # 打开动作
        open_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton)), "打开", self)
        open_action.setShortcut(QKeySequence.Open)
        open_action.setStatusTip("打开文件")
        open_action.triggered.connect(self.open_file)
        main_toolbar.addAction(open_action)
        
        # 保存动作
        save_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_DialogSaveButton)), "保存", self)
        save_action.setShortcut(QKeySequence.Save)
        save_action.setStatusTip("保存文件")
        save_action.triggered.connect(self.save_file)
        main_toolbar.addAction(save_action)
        
        # 分隔符
        main_toolbar.addSeparator()
        
        # 剪切动作
        cut_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_DialogCancelButton)), "剪切", self)
        cut_action.setShortcut(QKeySequence.Cut)
        cut_action.setStatusTip("剪切选中内容")
        cut_action.triggered.connect(self.text_edit.cut)
        main_toolbar.addAction(cut_action)
        
        # 复制动作
        copy_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_FileDialogContentsView)), "复制", self)
        copy_action.setShortcut(QKeySequence.Copy)
        copy_action.setStatusTip("复制选中内容")
        copy_action.triggered.connect(self.text_edit.copy)
        main_toolbar.addAction(copy_action)
        
        # 粘贴动作
        paste_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_DialogApplyButton)), "粘贴", self)
        paste_action.setShortcut(QKeySequence.Paste)
        paste_action.setStatusTip("粘贴内容")
        paste_action.triggered.connect(self.text_edit.paste)
        main_toolbar.addAction(paste_action)
        
        # 分隔符
        main_toolbar.addSeparator()
        
        # 添加小部件
        font_combo = QComboBox()
        font_combo.addItems(["Arial", "Times New Roman", "Courier New", "Verdana"])
        font_combo.currentIndexChanged.connect(self.change_font)
        main_toolbar.addWidget(QLabel("字体:"))
        main_toolbar.addWidget(font_combo)
        
        # 2. 格式工具栏
        format_toolbar = QToolBar("格式工具栏", self)
        format_toolbar.setIconSize(QSize(20, 20))
        self.addToolBar(Qt.TopToolBarArea, format_toolbar)
        
        # 粗体动作
        bold_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_MessageBoxInformation)), "粗体", self)
        bold_action.setCheckable(True)
        bold_action.setShortcut(QKeySequence("Ctrl+B"))
        bold_action.setStatusTip("切换粗体")
        bold_action.triggered.connect(self.toggle_bold)
        format_toolbar.addAction(bold_action)
        
        # 斜体动作
        italic_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_MessageBoxQuestion)), "斜体", self)
        italic_action.setCheckable(True)
        italic_action.setShortcut(QKeySequence("Ctrl+I"))
        italic_action.setStatusTip("切换斜体")
        italic_action.triggered.connect(self.toggle_italic)
        format_toolbar.addAction(italic_action)
        
        # 下划线动作
        underline_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_MessageBoxWarning)), "下划线", self)
        underline_action.setCheckable(True)
        underline_action.setShortcut(QKeySequence("Ctrl+U"))
        underline_action.setStatusTip("切换下划线")
        underline_action.triggered.connect(self.toggle_underline)
        format_toolbar.addAction(underline_action)
        
        format_toolbar.addSeparator()
        
        # 对齐动作组
        align_left_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_ArrowLeft)), "左对齐", self)
        align_left_action.setCheckable(True)
        align_left_action.setStatusTip("左对齐文本")
        align_left_action.triggered.connect(lambda: self.set_alignment(Qt.AlignLeft))
        
        align_center_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_ArrowDown)), "居中", self)
        align_center_action.setCheckable(True)
        align_center_action.setStatusTip("居中对齐文本")
        align_center_action.triggered.connect(lambda: self.set_alignment(Qt.AlignCenter))
        
        align_right_action = QAction(QIcon(self.style().standardIcon(QStyle.SP_ArrowRight)), "右对齐", self)
        align_right_action.setCheckable(True)
        align_right_action.setStatusTip("右对齐文本")
        align_right_action.triggered.connect(lambda: self.set_alignment(Qt.AlignRight))
        
        # 创建动作组确保单选
        align_group = QActionGroup(self)
        align_group.addAction(align_left_action)
        align_group.addAction(align_center_action)
        align_group.addAction(align_right_action)
        align_left_action.setChecked(True)
        
        format_toolbar.addAction(align_left_action)
        format_toolbar.addAction(align_center_action)
        format_toolbar.addAction(align_right_action)
        
        # 3. 自定义工具栏(右侧)
        custom_toolbar = QToolBar("自定义工具栏", self)
        custom_toolbar.setOrientation(Qt.Vertical)
        self.addToolBar(Qt.RightToolBarArea, custom_toolbar)
        
        # 搜索框
        search_edit = QLineEdit()
        search_edit.setPlaceholderText("搜索...")
        search_edit.setMaximumWidth(150)
        search_edit.returnPressed.connect(self.search_text)
        custom_toolbar.addWidget(search_edit)
        
        # 搜索按钮
        search_button = QPushButton("搜索")
        search_button.clicked.connect(self.search_text)
        custom_toolbar.addWidget(search_button)
        
        custom_toolbar.addSeparator()
        
        # 缩放控件
        custom_toolbar.addWidget(QLabel("缩放:"))
        zoom_slider = QSlider(Qt.Horizontal)
        zoom_slider.setRange(50, 200)
        zoom_slider.setValue(100)
        zoom_slider.setTickPosition(QSlider.TicksBelow)
        zoom_slider.setTickInterval(25)
        zoom_slider.valueChanged.connect(self.zoom_text)
        custom_toolbar.addWidget(zoom_slider)
        
        # 4. 浮动工具栏
        float_toolbar = QToolBar("浮动工具栏", self)
        float_toolbar.setFloatable(True)
        float_toolbar.setMovable(True)
        self.addToolBar(float_toolbar)
        
        # 添加一些动作
        for i in range(1, 4):
            action = QAction(f"动作 {i}", self)
            action.triggered.connect(lambda checked, num=i: self.float_action(num))
            float_toolbar.addAction(action)
    
    def new_file(self):
        self.text_edit.clear()
        self.status_bar.showMessage("已创建新文件", 2000)
    
    def open_file(self):
        self.status_bar.showMessage("打开文件...", 2000)
    
    def save_file(self):
        self.status_bar.showMessage("文件已保存", 2000)
    
    def toggle_bold(self):
        self.status_bar.showMessage("粗体已切换", 2000)
    
    def toggle_italic(self):
        self.status_bar.showMessage("斜体已切换", 2000)
    
    def toggle_underline(self):
        self.status_bar.showMessage("下划线已切换", 2000)
    
    def set_alignment(self, alignment):
        align_name = {
            Qt.AlignLeft: "左对齐",
            Qt.AlignCenter: "居中",
            Qt.AlignRight: "右对齐"
        }
        self.status_bar.showMessage(f"文本对齐: {align_name.get(alignment, '未知')}", 2000)
    
    def change_font(self, index):
        self.status_bar.showMessage(f"字体已更改为: {self.sender().currentText()}", 2000)
    
    def search_text(self):
        self.status_bar.showMessage("正在搜索...", 2000)
    
    def zoom_text(self, value):
        self.status_bar.showMessage(f"缩放级别: {value}%", 2000)
    
    def float_action(self, num):
        self.status_bar.showMessage(f"浮动工具栏动作 {num} 被触发", 2000)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ToolbarDemo()
    window.show()
    sys.exit(app.exec_())

QToolBar 常用方法

工具栏属性

  • setMovable(movable: bool): 设置工具栏是否可移动
  • setFloatable(floatable: bool): 设置工具栏是否可浮动
  • setIconSize(size: QSize): 设置工具栏图标大小
  • setToolButtonStyle(style: Qt.ToolButtonStyle): 设置按钮样式
    • Qt.ToolButtonIconOnly: 只显示图标
    • Qt.ToolButtonTextOnly: 只显示文本
    • Qt.ToolButtonTextBesideIcon: 文本在图标旁边
    • Qt.ToolButtonTextUnderIcon: 文本在图标下方
    • Qt.ToolButtonFollowStyle: 跟随系统样式
  • setOrientation(orientation: Qt.Orientation): 设置工具栏方向(水平或垂直)
  • setAllowedAreas(areas: Qt.ToolBarAreas): 设置允许停靠的区域
  • setArea(area: Qt.ToolBarArea): 设置工具栏位置

添加内容

  • addAction(action: QAction): 添加动作
  • addActions(actions: Iterable[QAction]): 添加多个动作
  • addSeparator(): 添加分隔符
  • addWidget(widget: QWidget): 添加小部件
  • insertWidget(before: QAction, widget: QWidget): 在指定动作前插入小部件
  • insertSeparator(before: QAction): 在指定动作前插入分隔符

其他方法

  • clear(): 清除工具栏内容
  • toggleViewAction() -> QAction: 获取切换工具栏可见性的动作
  • widgetForAction(action: QAction) -> QWidget: 获取与动作关联的小部件

高级功能示例

自定义工具栏样式

# 创建自定义样式的工具栏
styled_toolbar = QToolBar("自定义样式工具栏", self)
styled_toolbar.setStyleSheet("""
    QToolBar {
        background-color: #f0f0f0;
        border: 1px solid #ccc;
        border-radius: 4px;
        padding: 2px;
        spacing: 3px;
    }
    
    QToolButton {
        background-color: #e0e0e0;
        border: 1px solid #aaa;
        border-radius: 3px;
        padding: 3px;
    }
    
    QToolButton:hover {
        background-color: #d0d0d0;
    }
    
    QToolButton:pressed {
        background-color: #c0c0c0;
    }
    
    QToolButton:checked {
        background-color: #3498db;
        color: white;
    }
""")
self.addToolBar(styled_toolbar)

# 添加动作
for i in range(1, 4):
    action = QAction(f"样式按钮 {i}", self)
    action.setCheckable(True)
    styled_toolbar.addAction(action)

动态工具栏

# 创建动态工具栏
dynamic_toolbar = QToolBar("动态工具栏", self)
self.addToolBar(dynamic_toolbar)

# 添加按钮来修改工具栏
toggle_button = QPushButton("切换工具栏内容")
toggle_button.clicked.connect(self.toggle_toolbar_content)
dynamic_toolbar.addWidget(toggle_button)

def toggle_toolbar_content(self):
    # 清除当前内容
    for action in self.dynamic_toolbar.actions():
        self.dynamic_toolbar.removeAction(action)
    
    # 添加新内容
    if hasattr(self, 'toolbar_state') and self.toolbar_state:
        # 状态1:添加文本按钮
        for i in range(1, 4):
            action = QAction(f"文本按钮 {i}", self)
            self.dynamic_toolbar.addAction(action)
    else:
        # 状态2:添加图标按钮
        icons = [
            self.style().standardIcon(QStyle.SP_DialogOkButton),
            self.style().standardIcon(QStyle.SP_DialogCancelButton),
            self.style().standardIcon(QStyle.SP_DialogHelpButton)
        ]
        for i, icon in enumerate(icons, 1):
            action = QAction(icon, f"图标按钮 {i}", self)
            self.dynamic_toolbar.addAction(action)
    
    # 切换状态
    self.toolbar_state = not getattr(self, 'toolbar_state', False)

带下拉菜单的工具栏按钮

# 创建带下拉菜单的工具栏按钮
menu_toolbar = QToolBar("菜单工具栏", self)
self.addToolBar(menu_toolbar)

# 创建菜单
menu = QMenu(self)
menu.addAction("选项 1")
menu.addAction("选项 2")
menu.addAction("选项 3")

# 创建带菜单的按钮
menu_button = QToolButton()
menu_button.setText("菜单按钮")
menu_button.setMenu(menu)
menu_button.setPopupMode(QToolButton.MenuButtonPopup)

# 添加到工具栏
menu_toolbar.addWidget(menu_button)

工具栏可见性控制

# 创建工具栏可见性控制
view_menu = self.menuBar().addMenu("视图(&V)")

# 添加工具栏切换动作
toolbar_actions = []
for toolbar in self.findChildren(QToolBar):
    action = toolbar.toggleViewAction()
    action.setText(toolbar.windowTitle())
    view_menu.addAction(action)
    toolbar_actions.append(action)

# 添加"显示所有工具栏"动作
show_all_action = QAction("显示所有工具栏", self)
show_all_action.triggered.connect(lambda: [a.setChecked(True) for a in toolbar_actions])
view_menu.addAction(show_all_action)

# 添加"隐藏所有工具栏"动作
hide_all_action = QAction("隐藏所有工具栏", self)
hide_all_action.triggered.connect(lambda: [a.setChecked(False) for a in toolbar_actions])
view_menu.addAction(hide_all_action)

实际应用场景

  1. 文本编辑器​:文件操作、格式设置、查找替换等
  2. 图形设计工具​:绘图工具、颜色选择、图层管理
  3. IDE开发环境​:编译、调试、版本控制
  4. 媒体播放器​:播放控制、音量调节、播放列表
  5. 数据分析工具​:数据筛选、图表类型、导出选项
  6. 网页浏览器​:导航控制、书签管理、开发者工具
  7. CAD软件​:绘图工具、测量工具、视图控制

完整示例:图像编辑器工具栏

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QToolBar, QAction, 
                             QLabel, QStatusBar, QWidget, QVBoxLayout, 
                             QFileDialog, QColorDialog, QComboBox, QSlider,
                             QDockWidget, QGraphicsView, QGraphicsScene)
from PyQt5.QtGui import QIcon, QPixmap, QColor, QImage, QPainter, QPen, QBrush
from PyQt5.QtCore import Qt, QPoint, QSize

class ImageEditor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("图像编辑器")
        self.setGeometry(300, 300, 1000, 700)
        
        # 初始化变量
        self.image = QImage()
        self.last_point = QPoint()
        self.drawing = False
        self.pen_color = QColor(Qt.black)
        self.pen_width = 3
        self.current_tool = "pen"
        
        # 创建中央部件
        self.create_central_widget()
        
        # 创建状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage("就绪")
        
        # 创建工具栏
        self.create_toolbars()
        
        # 创建侧边栏
        self.create_sidebar()
    
    def create_central_widget(self):
        # 创建图形视图和场景
        self.graphics_view = QGraphicsView()
        self.scene = QGraphicsScene()
        self.graphics_view.setScene(self.scene)
        
        # 设置中央部件
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.graphics_view)
        self.setCentralWidget(central_widget)
    
    def create_toolbars(self):
        # 1. 主工具栏
        main_toolbar = self.addToolBar("主工具栏")
        main_toolbar.setIconSize(QSize(24, 24))
        
        # 打开动作
        open_action = QAction(QIcon("open.png"), "打开", self)
        open_action.setShortcut(QKeySequence.Open)
        open_action.setStatusTip("打开图像文件")
        open_action.triggered.connect(self.open_image)
        main_toolbar.addAction(open_action)
        
        # 保存动作
        save_action = QAction(QIcon("save.png"), "保存", self)
        save_action.setShortcut(QKeySequence.Save)
        save_action.setStatusTip("保存图像")
        save_action.triggered.connect(self.save_image)
        main_toolbar.addAction(save_action)
        
        # 分隔符
        main_toolbar.addSeparator()
        
        # 撤销动作
        undo_action = QAction(QIcon("undo.png"), "撤销", self)
        undo_action.setShortcut(QKeySequence.Undo)
        undo_action.setStatusTip("撤销上一个操作")
        main_toolbar.addAction(undo_action)
        
        # 重做动作
        redo_action = QAction(QIcon("redo.png"), "重做", self)
        redo_action.setShortcut(QKeySequence.Redo)
        redo_action.setStatusTip("重做上一个操作")
        main_toolbar.addAction(redo_action)
        
        # 分隔符
        main_toolbar.addSeparator()
        
        # 缩放控件
        main_toolbar.addWidget(QLabel("缩放:"))
        self.zoom_slider = QSlider(Qt.Horizontal)
        self.zoom_slider.setRange(25, 400)
        self.zoom_slider.setValue(100)
        self.zoom_slider.setTickPosition(QSlider.TicksBelow)
        self.zoom_slider.setTickInterval(25)
        self.zoom_slider.valueChanged.connect(self.zoom_image)
        main_toolbar.addWidget(self.zoom_slider)
        
        # 2. 绘图工具栏
        draw_toolbar = QToolBar("绘图工具栏", self)
        draw_toolbar.setIconSize(QSize(32, 32))
        self.addToolBar(Qt.LeftToolBarArea, draw_toolbar)
        
        # 工具按钮组
        self.tool_group = QActionGroup(self)
        
        # 画笔工具
        pen_action = QAction(QIcon("pen.png"), "画笔", self)
        pen_action.setCheckable(True)
        pen_action.setChecked(True)
        pen_action.triggered.connect(lambda: self.set_tool("pen"))
        draw_toolbar.addAction(pen_action)
        self.tool_group.addAction(pen_action)
        
        # 橡皮擦工具
        eraser_action = QAction(QIcon("eraser.png"), "橡皮擦", self)
        eraser_action.setCheckable(True)
        eraser_action.triggered.connect(lambda: self.set_tool("eraser"))
        draw_toolbar.addAction(eraser_action)
        self.tool_group.addAction(eraser_action)
        
        # 填充工具
        fill_action = QAction(QIcon("fill.png"), "填充", self)
        fill_action.setCheckable(True)
        fill_action.triggered.connect(lambda: self.set_tool("fill"))
        draw_toolbar.addAction(fill_action)
        self.tool_group.addAction(fill_action)
        
        # 文本工具
        text_action = QAction(QIcon("text.png"), "文本", self)
        text_action.setCheckable(True)
        text_action.triggered.connect(lambda: self.set_tool("text"))
        draw_toolbar.addAction(text_action)
        self.tool_group.addAction(text_action)
        
        # 形状工具
        shape_action = QAction(QIcon("shape.png"), "形状", self)
        shape_action.setCheckable(True)
        shape_action.triggered.connect(lambda: self.set_tool("shape"))
        draw_toolbar.addAction(shape_action)
        self.tool_group.addAction(shape_action)
        
        draw_toolbar.addSeparator()
        
        # 颜色选择
        color_action = QAction(QIcon("color.png"), "选择颜色", self)
        color_action.triggered.connect(self.choose_color)
        draw_toolbar.addAction(color_action)
        
        # 显示当前颜色
        self.color_label = QLabel()
        self.color_label.setFixedSize(32, 32)
        self.color_label.setStyleSheet(f"background-color: {self.pen_color.name()}; border: 1px solid black;")
        draw_toolbar.addWidget(self.color_label)
        
        # 画笔大小
        draw_toolbar.addWidget(QLabel("大小:"))
        self.width_slider = QSlider(Qt.Horizontal)
        self.width_slider.setRange(1, 50)
        self.width_slider.setValue(self.pen_width)
        self.width_slider.valueChanged.connect(self.set_pen_width)
        draw_toolbar.addWidget(self.width_slider)
    
    def create_sidebar(self):
        # 创建侧边栏停靠窗口
        sidebar = QDockWidget("属性", self)
        sidebar.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable)
        sidebar.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
        
        # 创建侧边栏内容
        sidebar_widget = QWidget()
        sidebar_layout = QVBoxLayout(sidebar_widget)
        
        # 添加控件
        sidebar_layout.addWidget(QLabel("图像属性"))
        
        # 图像大小
        size_label = QLabel("大小: 0 x 0")
        sidebar_layout.addWidget(size_label)
        
        # 格式
        format_label = QLabel("格式: 无")
        sidebar_layout.addWidget(format_label)
        
        # 添加更多控件...
        sidebar_layout.addStretch()
        
        sidebar.setWidget(sidebar_widget)
        self.addDockWidget(Qt.RightDockWidgetArea, sidebar)
    
    def open_image(self):
        file_path, _ = QFileDialog.getOpenFileName(
            self, "打开图像", "", "图像文件 (*.png *.jpg *.jpeg *.bmp)"
        )
        
        if file_path:
            self.image = QImage(file_path)
            if not self.image.isNull():
                self.scene.clear()
                self.scene.addPixmap(QPixmap.fromImage(self.image))
                self.status_bar.showMessage(f"已打开: {file_path}", 2000)
                self.zoom_slider.setValue(100)
            else:
                self.status_bar.showMessage("无法打开图像文件", 2000)
    
    def save_image(self):
        if self.image.isNull():
            return
            
        file_path, _ = QFileDialog.getSaveFileName(
            self, "保存图像", "", "PNG图像 (*.png);;JPEG图像 (*.jpg *.jpeg);;位图 (*.bmp)"
        )
        
        if file_path:
            if self.image.save(file_path):
                self.status_bar.showMessage(f"图像已保存: {file_path}", 2000)
            else:
                self.status_bar.showMessage("保存图像失败", 2000)
    
    def zoom_image(self, value):
        scale = value / 100.0
        self.graphics_view.resetTransform()
        self.graphics_view.scale(scale, scale)
        self.status_bar.showMessage(f"缩放: {value}%", 2000)
    
    def set_tool(self, tool):
        self.current_tool = tool
        self.status_bar.showMessage(f"当前工具: {tool}", 2000)
    
    def choose_color(self):
        color = QColorDialog.getColor(self.pen_color, self, "选择颜色")
        if color.isValid():
            self.pen_color = color
            self.color_label.setStyleSheet(f"background-color: {color.name()}; border: 1px solid black;")
    
    def set_pen_width(self, width):
        self.pen_width = width
        self.status_bar.showMessage(f"画笔大小: {width}px", 2000)
    
    def mousePressEvent(self, event):
        if self.current_tool == "pen" and not self.image.isNull():
            self.drawing = True
            self.last_point = self.graphics_view.mapToScene(event.pos()).toPoint()
    
    def mouseMoveEvent(self, event):
        if self.drawing and self.current_tool == "pen" and not self.image.isNull():
            painter = QPainter(self.image)
            painter.setPen(QPen(self.pen_color, self.pen_width, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            
            current_point = self.graphics_view.mapToScene(event.pos()).toPoint()
            painter.drawLine(self.last_point, current_point)
            self.last_point = current_point
            
            self.scene.clear()
            self.scene.addPixmap(QPixmap.fromImage(self.image))
    
    def mouseReleaseEvent(self, event):
        if self.drawing:
            self.drawing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ImageEditor()
    window.show()
    sys.exit(app.exec_())

最佳实践

  1. 合理分组​:将相关功能组织在同一个工具栏中
  2. 图标清晰​:使用清晰、易懂的图标
  3. 工具提示​:为每个工具提供状态提示
  4. 快捷键​:为常用工具设置快捷键
  5. 上下文相关​:根据当前操作上下文显示/隐藏工具栏
  6. 自定义选项​:允许用户自定义工具栏
  7. 响应式设计​:确保工具栏在不同屏幕尺寸下正常工作
  8. 一致性​:保持工具栏风格与应用程序整体一致
  9. 适度使用​:避免工具栏过多导致界面混乱
  10. 无障碍支持​:确保工具栏可通过键盘访问

QToolBar 是创建专业应用程序界面的重要组件,通过合理设计和实现工具栏,可以显著提升用户体验和工作效率。

参考:

  1. PyQt pyqtSignal使用详解-CSDN博客
  2. Pyqt5日志记录 多种颜色|极客教程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值