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

news2025/3/12 12:37:23

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())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设置默认构建变体 Build Variant

Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…

【大模型】DeepSeek使用与原理解析:从V3到R1

文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力&#xff…

DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类

学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…

LangChain大模型应用开发:提示词工程应用与实践

介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是LangChain提示词工程应用与实践。 在如今火热的大语言模型应用领域里,LangChain可是一个相当强大且实用的工具。而其中的提示词(Prompt),更是我们与语言模型进行有效沟通的关…

2025 N1CTF crypto 复现

近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…

Windows Defender Control--禁用Windows安全中心

Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#

mount 出现 2038 问题

在 linux 上挂载 ext4 文件系统时出现了 2038 年问题,如下: [ 236.388500] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 236.388560] ext4 filesystem being mounted at /root/tmp supports timestamps until 2…

【第12章:深度学习与伦理、隐私—12.4 深度学习与伦理、隐私领域的未来挑战与应对策略】

凌晨三点的自动驾驶测试场,AI系统突然在暴雨中做出惊人决策——它选择撞向隔离带而不是紧急变道,因为算法推演发现隔离带后的应急车道站着五个工程师。这个惊悚的伦理困境,揭开了深度学习伦理危机最尖锐的冰山一角。 一、潘多拉魔盒已开:深度学习伦理的四大原罪 1.1 数据原…

RL--2

强化学习当中最难的两个点是: 1.reward delay; 2.agent的行为会影响到之后看到的东西,所以agent要学会探索世界; 关于强化学习的不同类型,可以分为以下三种: 一种是policy based:可以理解为它是…

SpringMVC新版本踩坑[已解决]

问题: 在使用最新版本springMVC做项目部署时,浏览器反复500,如下图: 异常描述: 类型异常报告 消息Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [int] not specifie…

2025 pwn_A_childs_dream

文章目录 fc/sfc mesen下载和使用推荐 fc/sfc https://www.mesen.ca/docs/ mesen2安装,vscode安装zg 任天堂yyds w d 左右移动 u结束游戏 i崩溃或者卡死了 L暂停 D658地方有个flag 发现DEEE会使用他。且只有这个地方,maybe会输出flag,应…

pandas(11 分类数据和数据可视化)

前面内容:pandas(10 日期和Timedelta) 目录 一、Python Pandas 分类数据 1.1 pd.Categorical() 1.2 describe() 1.3 获取类别的属性 1.4 分类操作 1.5 分类数据的比较 二、Python Pandas 数据可视化 2.1 基础绘图:plot 2.2 条形图 2.3 直方…

Redis 03章——10大数据类型概述

一、which10 (1)一图 (2)提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 官网:Understand Redis data types | Docs (3)分别是 1.3.1redis字符串&#xff0…

bps是什么意思

本文来自DeepSeek "bps" 是 "bits per second" 的缩写,表示每秒传输的比特数,用于衡量数据传输速率。1 bps 即每秒传输 1 比特。 常见单位 bps:比特每秒 Kbps:千比特每秒(1 Kbps 1,000 bps&am…

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…

项目版本号生成

需求 项目想要生成一个更新版本号,格式为v2.0.20250101。 其中v2.0为版本号,更新时进行配置;20250101为更新日期,版本更新时自动生成。 实现思路 创建一个配置文件version.properties,在其中配置版本号&#xff1b…