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

PySide6 GUI 学习笔记——常用类及控件使用方法(常用控件调色板QPalette)

文章目录

    • 1. 概述
    • 2. 颜色角色表(ColorRole)
    • 3. 常用方法
    • 4. Python示例
    • 5. 关键特性说明
    • 6. 最佳实践

1. 概述

QPalette管理Qt控件的颜色方案,它的颜色组ColorGroup包含3个状态:

• Active:激活状态,获得焦点;
激活状态

• Inactive:非激活状态,失去焦点;
非激活状态

• Disabled:失效状态,控件不可用。
失效状态

通过修改调色板可实现应用程序主题的统一管理。

2. 颜色角色表(ColorRole)

枚举值描述
Window窗口背景色
WindowText窗口前景色(文本)
Base文本输入控件背景色
Text与Base搭配的文本颜色
Button按钮背景色
ButtonText按钮文本颜色
Highlight选中项背景色
HighlightedText选中项文本颜色
ToolTipBase工具提示背景色
ToolTipText工具提示文本颜色
BrightText高对比度文本色
Link超链接颜色
LinkVisited已访问链接颜色
AlternateBase交替行背景色
PlaceholderText输入占位符文本颜色
Shadow阴影颜色

(完整枚举共21个角色,此处列出常用15个,详细内容可参考官方文档)

3. 常用方法

方法参数返回类型描述
color()ColorGroup, ColorRoleQColor获取颜色值
brush()ColorGroup, ColorRoleQBrush获取画刷对象
setColor()ColorRole, QColorvoid设置颜色(所有组)
setBrush()ColorGroup, ColorRole, QBrushvoid设置指定组画刷
currentColorGroup()-ColorGroup获取当前颜色组
isEqual()ColorGroup, ColorGroupbool比较颜色组是否相同

4. Python示例

import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
from PySide6.QtGui import QPalette, QColor
from PySide6.QtCore import Qtclass DemoWindow(QWidget):def __init__(self):super().__init__()# 创建按钮self.btn = QPushButton("测试按钮", self)self.btn.setGeometry(50, 50, 120, 40)# 获取当前调色板palette = self.palette()# 修改颜色角色palette.setColor(QPalette.Button, QColor("#009688"))  # 按钮背景palette.setColor(QPalette.ButtonText, QColor("white"))  # 按钮文本palette.setColor(QPalette.Highlight, QColor("#FF5722"))  # 选中背景# 应用调色板self.setPalette(palette)self.resize(200, 150)self.setWindowTitle("调色板演示")if __name__ == "__main__":app = QApplication(sys.argv)window = DemoWindow()window.show()sys.exit(app.exec())

运行效果

import sys
from PySide6.QtWidgets import QApplication, QWidget, QLabel
from PySide6.QtGui import QFont, QColor, QPalette
from random import randint, seedclass SetPalette(QWidget):def __init__(self,parent=None):super().__init__(parent)self.setGeometry(200,200,1200,500)  #设置窗口尺寸self.setWindowTitle("设置调色板实例")self.createLabels()  #调用函数self.setLabelColor()  #调用函数self.getLabelColorRGB()  #调用函数def createLabels(self):  #创建10个标签self.labels = list()font = QFont("黑体",pointSize=20)string = "Nice to meet you! 很高兴认识你!"for i in range(10):label = QLabel(self)  #在窗口上创建标签控件label.setGeometry(5,50*i,1200,40)  #标签位置和尺寸label.setText(str(i)+': '+string)  #设置标签文字label.setFont(font)  #设置标签文字的字体self.labels.append(label) #标签列表def setLabelColor(self):seed(12)for label in self.labels:colorBase = QColor(randint(0,255), randint(0,255), randint(0,255))  #定义颜色colorText = QColor(randint(0,255), randint(0,255), randint(0,255))  #定义颜色palette = label.palette()# palette.setColor(palette.Active,palette.Window,colorBase)  #定义背景色# palette.setColor(palette.Active,palette.WindowText,colorText) #定义前景色palette.setColor(QPalette.ColorGroup.Active,QPalette.ColorRole.Window,colorBase)  #定义背景色palette.setColor(QPalette.ColorGroup.Active,QPalette.ColorRole.WindowText,colorText) #定义前景色label.setAutoFillBackground(True)  #设置背景自动填充label.setPalette(palette)  #设置调色板def getLabelColorRGB(self):  #获取标签前景颜色和背景颜色RGB值for label in self.labels:r,g,b,a = label.palette().window().color().getRgb()  #获取背景颜色的RGB值rT,gT,bT,a = label.palette().windowText().color().getRgb()#获取文字颜色的RGB值text = (f"{label.text()}背景颜色:{r} {g} {b} 文字颜色:{rT} {gT} {bT}")label.setText(text)
if __name__ == '__main__':app = QApplication(sys.argv)window = SetPalette()window.show()sys.exit(app.exec())

获得焦点时:
获得焦点时

失去焦点时:
失去焦点时

5. 关键特性说明

• 颜色继承:未明确设置的角色会自动继承关联颜色

• 隐式共享:调色板对象采用写时复制机制,高效传递

• 平台适配:建议基于QGuiApplication.palette()修改而非创建新调色板

• 状态管理:Disabled组自动应用50%透明度混合效果

6. 最佳实践

  • (1) 优先使用颜色角色而非固定颜色值
  • (2) 修改Inactive组会影响非活动窗口外观
  • (3) 使用resolve()方法合并多个调色板配置
  • (4) 复杂样式建议使用QSS+调色板组合方案

注意:某些系统主题(如Windows/Mac原生主题)可能覆盖调色板设置,建议在应用初始化时设置QApplication.setPalette()保证一致性。

相关文章:

  • 【LUT技术专题】DnLUT代码解读
  • 进程——概念及状态
  • NHANES最新指标推荐:NHR
  • DP2 跳台阶【牛客网】
  • win版mysql8.0和redis,解压即用
  • YOLO模型初次训练体验(+实测)
  • 时态--07--过去完成時
  • 探秘「4+3原型驱动的交付模式」如何实现软件快速定制
  • 现代计算机图形学Games101入门笔记(十八)
  • 《算法笔记》11.8小节——动态规划专题->总结 问题 B: 拦截导弹
  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 2025年电工杯新规发布-近三年题目以及命题趋势
  • vLLM框架高效原因分析
  • 游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • 四元数中 w xyz 的含义及应用
  • 一文掌握 LoRA 常见变体
  • Ubuntu操作系统里面安装Docker Compose
  • 大模型高效微调技术全面解析:从PEFT原理到实战应用
  • 从马相伯到谢希德:复旦大学校长传记系列再版首发
  • 失智老人有两个儿子却欠费住养老院两年多,法检合力指定监护人
  • 上影节官方海报公布:电影之城,每一帧都是生活
  • 中青报聚焦上海社区心理服务:社工介入让居民“心畅”
  • 人民日报任平:从“地瓜经济”理论到民营经济促进法,读懂中国经济的成长壮大之道
  • 世卫大会拒绝涉台提案,外交部:坚持一个中国原则是人心所向