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

发布于:2025-05-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

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()保证一致性。


网站公告

今日签到

点亮在社区的每一天
去签到