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, ColorRole | QColor | 获取颜色值 |
brush() | ColorGroup, ColorRole | QBrush | 获取画刷对象 |
setColor() | ColorRole, QColor | void | 设置颜色(所有组) |
setBrush() | ColorGroup, ColorRole, QBrush | void | 设置指定组画刷 |
currentColorGroup() | - | ColorGroup | 获取当前颜色组 |
isEqual() | ColorGroup, ColorGroup | bool | 比较颜色组是否相同 |
4. Python示例
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
from PySide6.QtGui import QPalette, QColor
from PySide6.QtCore import Qt
class 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, seed
class 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()
保证一致性。