pyqt5学习笔记3: 使用QPalette(调色板)
目录
1. 实例:
设置文本部件颜色
设置按钮部件颜色
效果图:
代码
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
- QPalette可以用来设置组件的颜色(组件的颜色还可以通过QSS来设置,另行讨论)
- 所有的Qt窗口都有一个QPalette
- QApplication也有一个QPalette
3. 如何通过调色板设置颜色
- _o_palette = _o_widget.palette() # 获取组件的palette()
- _o_palette.setColor(colorRole, color) # 为颜色角色设置颜色
- _o_widget.setPalette(_o_palette) # 为组件设置调色板
- _o_widget.setAutoFillBackground() # 要加上这句才生效
4. 调色板的影响范围
- 修改QApplication的调色板, 会影响到该应用程序的所有窗口部件.
- 对QApplication调色板的修改, 不会影响已经单独做了调色板修改的窗口部件.
- 修改一个窗口部件的调色板, 只影响这个窗口部件以及子窗口部件(不包含子窗口, 如只是以当前窗口作为父对象来管理内存, 而不在当前窗口显示);
- 对一个窗口部件的调色板作了修改后,再对其父窗口部件调色板进行修改, 不会影响到该窗口部件的调色板;
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)子窗口部件(不包含窗口) |
常用的颜色策略:
- 窗口标题栏: 活动状态(Active)的为蓝色, 非活动状态(inactive)的为灰色;
- 活动状态的窗口和非活动状态的窗口都可以包含状态为不可用(Disabled)的窗口部件;
- 一个不可用的窗口部件(包括该窗口部件包含的子窗口部件)显示为灰色, 用户无法同它进行交互;
5.2 ColorRoles:
名称 | 说明 |
---|---|
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表示颜色的深浅.