当前位置: 首页 > news >正文

ControlSizePyQt - PyQt 版本的统一尺寸和颜色管理系统

ControlSizePyQt - PyQt 版本的统一尺寸和颜色管理系统

概述

ControlSizePyQt 是 ControlSize 系统的 PyQt 版本实现,提供了一套与 WPF 版本 API 一致的尺寸和颜色管理方案。该系统可以让 PyQt 控件共享相同的尺寸和颜色配置,方便统一管理和维护。

项目结构

ControlSizePyQt/ ├── __init__.py # 包初始化文件 ├── control_size.py # 尺寸和颜色管理模块 ├── pyqt_button.py # PyQt 按钮控件实现 ├── demo.py # 演示程序 └── __pycache__/ # Python 编译缓存

核心组件

1. control_size.py - 尺寸和颜色管理模块

control_size.py模块定义了尺寸和颜色的常量和管理类,与 WPF 版本保持 API 一致性。

ControlSizeValues - 尺寸静态值
# 尺寸类型Large="Large"Default="Default"Small="Small"Mini="Mini"# 尺寸值映射size_values={Large:{"min_width":120,"height":40,"font_size":16},Default:{"min_width":80,"height":32,"font_size":14,"padding":(12,0,12,0)},Small:{"min_width":60,"height":24,"font_size":12},Mini:{"min_width":40,"height":20,"font_size":11,"padding":(8,0,8,0)}}
ControlColorValues - 颜色静态值
# 颜色类型Primary="Primary"Success="Success"Warning="Warning"Danger="Danger"Info="Info"Text="Text"Default="Default"# 颜色值映射(使用 CSS 颜色字符串)Colors={Primary:{"bg":"#409EFF","border":"#409EFF","text":"#FFFFFF"},Success:{"bg":"#67C23A","border":"#67C23A","text":"#FFFFFF"},Warning:{"bg":"#E6A23C","border":"#E6A23C","text":"#FFFFFF"},Danger:{"bg":"#F56C6C","border":"#F56C6C","text":"#FFFFFF"},Info:{"bg":"#909399","border":"#909399","text":"#FFFFFF"},Text:{"bg":"transparent","border":"transparent","text":"#409EFF"},Default:{"bg":"#F5F7FA","border":"#DCDFE6","text":"#303133"}}
ControlSize - 尺寸管理类
classControlSize:@staticmethoddefset_size(widget,size_type):"""设置控件尺寸 Args: widget: PyQt 控件对象 size_type: 尺寸类型字符串 (Large, Default, Small, Mini) """# 实现尺寸设置逻辑pass@staticmethoddefget_size(widget):"""获取控件尺寸类型 Args: widget: PyQt 控件对象 Returns: str: 尺寸类型字符串 """# 实现尺寸获取逻辑pass
ControlColor - 颜色管理类
classControlColor:@staticmethoddefset_type(widget,color_type):"""设置控件颜色类型 Args: widget: PyQt 控件对象 color_type: 颜色类型字符串 (Primary, Success, Warning, Danger, Info, Text, Default) """# 实现颜色设置逻辑pass@staticmethoddefget_type(widget):"""获取控件颜色类型 Args: widget: PyQt 控件对象 Returns: str: 颜色类型字符串 """# 实现颜色获取逻辑pass

2. pyqt_button.py - PyQt 按钮控件实现

pyqt_button.py实现了ElementButton类,是基于ControlSizeControlColor系统的 PyQt 按钮控件。

功能特性
  • 多种按钮类型:Primary、Success、Warning、Danger、Info、Text、Default(通过ControlColor.set_type设置)
  • 多种尺寸:Large、Default、Small、Mini(通过ControlSize.set_size设置)
  • 圆角和圆形:支持圆角和圆形按钮
  • 图标支持:支持图标显示
  • 加载状态:支持显示加载动画
  • 禁用状态:支持禁用状态
  • 自定义尺寸:支持直接设置 width 和 height 覆盖预设尺寸
  • 自定义颜色:支持直接设置背景色、边框色和前景色覆盖预设颜色
关键方法
classElementButton(QPushButton):def__init__(self,parent=None,content="",icon=""):"""初始化按钮 Args: parent: 父控件 content: 按钮文本 icon: 图标文本 """super().__init__(parent)# 初始化逻辑defset_content(self,content):"""设置按钮文本 Args: content: 按钮文本 """# 实现文本设置逻辑defset_icon(self,icon):"""设置按钮图标 Args: icon: 图标文本 """# 实现图标设置逻辑defset_is_loading(self,is_loading):"""设置加载状态 Args: is_loading: 是否显示加载状态 """# 实现加载状态设置逻辑defset_is_round(self,is_round):"""设置是否圆角 Args: is_round: 是否显示圆角 """# 实现圆角设置逻辑defset_is_circle(self,is_circle):"""设置是否圆形 Args: is_circle: 是否显示为圆形 """# 实现圆形设置逻辑

使用示例

基本使用

fromPyQt5.QtWidgetsimportQApplication,QVBoxLayout,QWidgetfromControlSizePyQt.pyqt_buttonimportElementButtonfromControlSizePyQt.control_sizeimportControlSize,ControlColor,ControlSizeValues,ControlColorValues app=QApplication([])# 创建主窗口window=QWidget()layout=QVBoxLayout(window)# 1. 基本按钮btn_primary=ElementButton(content="主要按钮")ControlColor.set_type(btn_primary,ControlColorValues.Primary)layout.addWidget(btn_primary)# 2. 不同尺寸按钮btn_large=ElementButton(content="大型按钮")ControlColor.set_type(btn_large,ControlColorValues.Primary)ControlSize.set_size(btn_large,ControlSizeValues.Large)layout.addWidget(btn_large)btn_small=ElementButton(content="小型按钮")ControlColor.set_type(btn_small,ControlColorValues.Primary)ControlSize.set_size(btn_small,ControlSizeValues.Small)layout.addWidget(btn_small)# 3. 自定义尺寸按钮btn_custom=ElementButton(content="自定义尺寸按钮")ControlColor.set_type(btn_custom,ControlColorValues.Success)btn_custom.setFixedSize(200,60)# 直接设置宽高,覆盖预设尺寸layout.addWidget(btn_custom)# 4. 圆角和圆形按钮btn_round=ElementButton(content="圆角按钮")ControlColor.set_type(btn_round,ControlColorValues.Warning)btn_round.set_is_round(True)layout.addWidget(btn_round)btn_circle=ElementButton(icon="🔍")ControlColor.set_type(btn_circle,ControlColorValues.Danger)btn_circle.set_is_circle(True)layout.addWidget(btn_circle)# 5. 带图标按钮btn_icon=ElementButton(content="带图标按钮",icon="📎")ControlColor.set_type(btn_icon,ControlColorValues.Info)layout.addWidget(btn_icon)# 6. 加载状态按钮btn_loading=ElementButton(content="加载中")ControlColor.set_type(btn_loading,ControlColorValues.Primary)btn_loading.set_is_loading(True)layout.addWidget(btn_loading)# 7. 禁用按钮btn_disabled=ElementButton(content="禁用按钮")ControlColor.set_type(btn_disabled,ControlColorValues.Primary)btn_disabled.setEnabled(False)layout.addWidget(btn_disabled)# 8. 自定义颜色按钮btn_custom_color=ElementButton(content="自定义颜色按钮")ControlColor.set_type(btn_custom_color,ControlColorValues.Primary)# 直接设置颜色,覆盖预设颜色btn_custom_color.setStyleSheet(""" QPushButton { background-color: #FF5722; border: 1px solid #FF5722; color: white; border-radius: 4px; padding: 0 12px; } QPushButton:hover { opacity: 0.8; } QPushButton:pressed { opacity: 0.6; } QPushButton:disabled { opacity: 0.4; } """)layout.addWidget(btn_custom_color)window.show()app.exec_()

运行演示程序

# 运行演示程序python ControlSizePyQt/demo.py

技术要点

  1. API 一致性:与 WPF 版本保持相同的 API 设计,便于跨平台开发
  2. 静态值集中管理:所有尺寸和颜色值集中在control_size.py中,便于统一修改
  3. CSS 样式:使用 PyQt 的样式表机制实现按钮样式
  4. 动态尺寸管理:通过ControlSize.set_size方法动态设置控件尺寸
  5. 动态颜色管理:通过ControlColor.set_type方法动态设置控件颜色
  6. 自定义覆盖:支持直接设置宽高和样式覆盖预设值
  7. 加载动画:使用 QMovie 实现加载动画效果

与 WPF 版本的对应关系

功能WPF 版本PyQt 版本
尺寸设置ControlSize.SetSize(button, ControlSizeValues.Large)ControlSize.set_size(btn, ControlSizeValues.Large)
颜色设置ControlColor.SetType(button, ControlColorValues.Primary)ControlColor.set_type(btn, ControlColorValues.Primary)
圆角设置IsRound="True"btn.set_is_round(True)
圆形设置IsCircle="True"btn.set_is_circle(True)
加载状态IsLoading="True"btn.set_is_loading(True)
图标设置Icon=""btn.set_icon("🔍")
自定义尺寸Width="200" Height="60"btn.setFixedSize(200, 60)
自定义颜色Background="#FF5722"通过样式表设置

如何扩展

添加新的尺寸类型

  1. control_size.py中添加新的尺寸常量:
# 尺寸类型SuperLarge="SuperLarge"# 尺寸值映射size_values={SuperLarge:{"min_width":150,"height":50,"font_size":18},# 其他尺寸...}
  1. pyqt_button.py中更新尺寸设置逻辑:
defset_size(self,size_type):ifsize_type==ControlSizeValues.SuperLarge:self.setMinimumWidth(150)self.setFixedHeight(50)self.setFont(QFont("Microsoft YaHei",18))# 其他尺寸处理...

添加新的颜色类型

  1. control_size.py中添加新的颜色常量和值:
# 颜色类型Secondary="Secondary"# 颜色值映射Colors={Secondary:{"bg":"#6C757D","border":"#6C757D","text":"#FFFFFF"},# 其他颜色...}
  1. pyqt_button.py中更新颜色设置逻辑:
defset_color_type(self,color_type):ifcolor_type==ControlColorValues.Secondary:self.setStyleSheet(""" QPushButton { background-color: #6C757D; border: 1px solid #6C757D; color: white; border-radius: 4px; padding: 0 12px; } # 其他样式... """)# 其他颜色处理...

在其他控件中使用

可以将ControlSizeControlColor系统应用到其他 PyQt 控件:

fromPyQt5.QtWidgetsimportQLineEditfromControlSizePyQt.control_sizeimportControlSize,ControlColor,ControlSizeValues,ControlColorValues# 创建文本框textbox=QLineEdit()# 设置尺寸ControlSize.set_size(textbox,ControlSizeValues.Large)# 设置颜色ControlColor.set_type(textbox,ControlColorValues.Primary)

注意事项

  • ControlSize.set_size方法会设置控件的最小宽度、固定高度和字体大小
  • ControlColor.set_type方法会设置控件的背景色、边框色和前景色
  • 当直接设置控件的宽高或样式时,会覆盖通过ControlSizeControlColor设置的值
  • 加载状态会显示动画并禁用按钮
  • 圆形按钮会自动设置为正方形并调整圆角大小
  • 图标按钮的图标会显示在文本左侧

构建和运行

依赖

  • Python 3.6+
  • PyQt5

安装依赖

pipinstallPyQt5

运行演示

# 运行演示程序python ControlSizePyQt/demo.py

总结

ControlSizePyQt 提供了与 WPF 版本一致的尺寸和颜色管理系统,使 PyQt 控件的样式管理更加统一和方便。通过静态值集中管理和动态设置机制,开发者可以快速创建具有一致外观的 PyQt 应用程序。

http://www.jsqmd.com/news/668823/

相关文章:

  • 网络工程师必看:H3C与华为认证体系的前世今生及备考选择指南
  • 淘一个二手铷原子钟并用起来的过程
  • 从卖不出去到月入15000,贵阳这两家公司凭什么让销售翻身? - 精选优质企业推荐官
  • 一文看懂推荐系统:排序09:Field-aware Factorization Machines (FFM) 的工业界冷思考:为何从FM到FFM的改进叫好不叫座?
  • uni-app怎么实现弹窗 uni-app自定义模态框遮罩层【代码】
  • ESP32上传图片到巴法云,除了HTTPClient,你还可以试试这个库
  • 频谱分析仪
  • Qt Quick项目实战:用KDDockWidgets 1.4.0为你的QML界面添加可拖拽停靠面板(附源码)
  • C语言学习日志
  • 学习分享数据结构对比
  • Spring Boot 自动装配原理(面试版 + 实战理解版)
  • 老年人扎堆学AI,背后藏着千亿级银发经济新蓝海
  • 别再让Quartus默认的1GHz时钟坑了你!手把手教你为FPGA点灯工程写SDC约束文件
  • 通风系统节能改造笔记:用PLC分段控制替代PID,稳定风压还省电(含现场数据对比)
  • 【2026年最新600套毕设项目分享】微信小程序的小说实体书商城(30106)
  • RKNN模型在RK3588上初始化失败?别慌,可能是你的虚拟环境和开发板版本对不上
  • AI开发-python-langchain框架(--pdf文件分页加载 )
  • Polkadot 技术栈地图 2026
  • 【计算机网络 实验报告6】路由选择协议
  • 从H264到H266:视频编码的‘乐高’块是如何越变越小的?一个动画演示看懂核心差异
  • 千问模型本地部署
  • 万字长文爆肝:彻底弄懂Linux文件系统(Ext2),从Inode、Block到Dentry核心机制全解析
  • 贵阳求职市场大洗牌:为什么AI营销和顾问型销售正在成为新的职业风口? - 精选优质企业推荐官
  • YOLOv5-face:面向实时人脸检测的优化架构与应用实践
  • 企业 Bug 管理工具推荐:8款主流缺陷跟踪系统对比解读
  • Google BwA 杭州场(Gemma 4 专题全国首发)线下活动记录
  • 别再混淆了!YOLOv5/v8模型评估里mAP@0.5和mAP@0.5:0.95到底怎么看?
  • 【热门技术深度讨论】AI Agent 自进化框架革命:从静态配置到生物级进化
  • 10年老兵带你学Java(第3课):数组和方法 - 代码的复用
  • 贵阳找工作该看什么?一份2026年本地招聘市场完整观察指南 - 精选优质企业推荐官