pyqt5学习笔记3: 使用QPalette(调色板)

1. 实例:

设置文本部件颜色
设置按钮部件颜色

效果图:
avatar

代码

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui

class CDemo(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.o_line_edit_0 = self._gen_line_edit_0()
        self.o_btn_0 = self._gen_btn_0()

        self.o_line_edit_1 = self._gen_line_edit_1()
        self.o_btn_1 = self._gen_btn_1()

        self.resize(300, 200)
        self.setLayout(self._gen_layout())

    def _gen_line_edit_0(self):
        _o_line_edit = QtWidgets.QLineEdit('line edit 0')
        _o_line_edit.setSelection(5, 9)
        return _o_line_edit

    def _gen_line_edit_1(self):
        _o_line_edit = QtWidgets.QLineEdit('line edit 1')
        #_o_palette = QtGui.QPalette()      # 创建一个新调色板
        _o_palette = _o_line_edit.palette() # 获取已有调色板,在已有调色板基础上修改
        _o_palette.setColor(QtGui.QPalette.Base           , QtCore.Qt.yellow) # 文本部件背景色
        _o_palette.setColor(QtGui.QPalette.Text           , QtCore.Qt.blue)   # 文本部件颜色
        _o_palette.setColor(QtGui.QPalette.Highlight      , QtCore.Qt.green)  # 文本部件选中的背景色
        _o_palette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.red)    # 文本部件选中的文本颜色

        _o_line_edit.setPalette(_o_palette)      # 为组件设置调色板
        _o_line_edit.setAutoFillBackground(True) # 不加这句,则颜色不生效
        return _o_line_edit

    def _gen_btn_0(self):
        _o_btn = QtWidgets.QPushButton('button 0')
        return _o_btn

    def _gen_btn_1(self):
        _o_btn = QtWidgets.QPushButton('button 1')

        #_o_palette = QtGui.QPalette()
        _o_palette = _o_btn.palette() # 获取已有调色板,在已有调色板基础上修改
        _o_palette.setColor(QtGui.QPalette.ButtonText, QtCore.Qt.blue)   # 按钮文本颜色
        #_o_palette.setColor(QtGui.QPalette.Button   , QtCore.Qt.yellow) # 按钮背景色,不起效
        # 注意:QPushButton的背景色涉及样式表,所以不能通过QPalette修改.

        _o_btn.setPalette(_o_palette)      # 为组件设置调色板
        _o_btn.setAutoFillBackground(True) # 不加这句,则颜色不生效
        return _o_btn

    def _gen_layout(self):
        _o_layout_0 = QtWidgets.QHBoxLayout()
        _o_layout_0.addWidget(self.o_line_edit_0)
        _o_layout_0.addWidget(self.o_btn_0)
        _o_layout_0.addStretch(1)

        _o_layout_1 = QtWidgets.QHBoxLayout()
        _o_layout_1.addWidget(self.o_line_edit_1)
        _o_layout_1.addWidget(self.o_btn_1)
        _o_layout_1.addStretch(1)

        _o_layout_main = QtWidgets.QVBoxLayout()
        _o_layout_main.addLayout(_o_layout_0)
        _o_layout_main.addLayout(_o_layout_1)

        return _o_layout_main

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = CDemo()
    win.show()
    sys.exit(app.exec_())

2. 哪些部件有QPalette

  1. QPalette可以用来设置组件的颜色(组件的颜色还可以通过QSS来设置,另行讨论)
  2. 所有的Qt窗口都有一个QPalette
  3. QApplication也有一个QPalette

3. 如何通过调色板设置颜色

  1. _o_palette = _o_widget.palette() # 获取组件的palette()
  2. _o_palette.setColor(colorRole, color) # 为颜色角色设置颜色
  3. _o_widget.setPalette(_o_palette) # 为组件设置调色板
  4. _o_widget.setAutoFillBackground() # 要加上这句才生效

4. 调色板的影响范围

  1. 修改QApplication的调色板, 会影响到该应用程序的所有窗口部件.
  2. 对QApplication调色板的修改, 不会影响已经单独做了调色板修改的窗口部件.
  3. 修改一个窗口部件的调色板, 只影响这个窗口部件以及子窗口部件(不包含子窗口, 如只是以当前窗口作为父对象来管理内存, 而不在当前窗口显示);
  4. 对一个窗口部件的调色板作了修改后,再对其父窗口部件调色板进行修改, 不会影响到该窗口部件的调色板;

5. color group和color role

调色板有两个基本概念:color group,color role,
调色板的setColor()命令通过color group和color role进行颜色设置。

setColor(QPalette.ColorGroup, QPalette.ColorRole, color_name)
setColor(QPalette.ColorRole, color_name)

其中color_name:
可以是Qt预定义的颜色,比如:QtCore.Qt.yellow
可以是通过QColor指定的颜色,比如QColor('#ffffff')或QColor(0, 1, 2), 具体可查看QColor的method。

5.1 ColorGroup:

名称 说明
Active Group 该组的颜色用于当前活动的(active)窗口,即具有键盘或鼠标焦点的窗口
Inactive Group 该组的颜色用于非活动的(其他)窗口
Disable Group 该组的颜色用于窗口为不可用的(disabled)子窗口部件(不包含窗口)

常用的颜色策略:

  1. 窗口标题栏: 活动状态(Active)的为蓝色, 非活动状态(inactive)的为灰色;
  2. 活动状态的窗口和非活动状态的窗口都可以包含状态为不可用(Disabled)的窗口部件;
  3. 一个不可用的窗口部件(包括该窗口部件包含的子窗口部件)显示为灰色, 用户无法同它进行交互;

5.2 ColorRoles:

avatar

名称 说明
QPalette.Window 窗口部件背景色(QPalette.Background已废弃)
QPalette.WindowText 窗口部件前景色(文本颜色)(QPalette.Foreground已废弃)
QPalette.Base 文本输入部件(QLineEdit等)背景色
QPalette.Text 文本输入部件(QLineEdit等)前景色(文本颜色)
QPalette.Button 按钮部件背景色(注: QPushButton的背景颜色涉及样式表, 所以不能通过QPalette修改)
QPalette.ButtonText 按钮部件前景色(文件颜色)
QPalette.Highlight 文字被选中后的背景色
QPalette.HighlightedText 文字被选中后的前景色(文本颜色)
QPalette.ToolTipBase QToolTip背景色
QPalette.ToolTipText QToolTip前景色
Qpalette.AlternateBase ?
Qpalette.BrightText ?

6. QtGui.QColor

QColor提供基于RGB、HSV、CMYK值的颜色

名称 中文名 说明
RGB 红绿蓝 加色模式
Red: 红色, RGB(255,0,0)
Green: 绿色, RGB(0,255,0)
Blue: 蓝色, RGB(0,0,255)
HSV ? Hue: 色调, 0~360(红:0, 绿:120, 蓝:240, 黄:60, 青:180, 品红:300)
Saturation: 饱和度, 0~100
Value: 明度, 0~100
CMYK 印刷四色模式 减色模式
Cyan: 青色/天蓝色, RGB(0, 255, 255)
Megenta: 品红/洋红, RGB(255,0,255)
Yellow: 黄色, RGB(255,255,0)
blacK:黑色(取尾字母,防止与Blue混淆)
SVG1.0 颜色值 颜色名称是RGB对应的16进制数组成的字符串 #{Red}{Green}{Blue}
比如RGB(10,20,30)对应 #0A141E

QColor的常用Method:

QColor(Qt.black)       # 通过颜色名称初始化QColor实例
QColor('#FFFFFF')      # 通过颜色HTML代号初始化QColor实例

QColor(i_red, i_green, i_blue)               # 通过RGB值初始化QColor实例
QColor.fromHsv(i_hue, i_saturation, i_value) # 通过HSV值初始化QColor实例

QColor.colorNames()    # 获取内置的颜色名列表

QColor(0,1,2).getRgb() # 获取RGB值的tuple,(0,1,2,255)
QColor(0,1,2).getHsv() # 获取HSV值的tuple,(210,255,2,255)

如何表示颜色深浅:
RGB转为YUV
Y = 0.30R+0.59G+0.11B 亮度
U = 0.493(B-Y) 色度
V = 0.877(R-Y) 色度
如果U和V都为0, 则没有颜色只有亮度, 就变成黑白了. 可以使用亮度Y表示颜色的深浅.

posted @ 2020-07-10 11:33  编程驴子  阅读(6366)  评论(0编辑  收藏  举报