目錄
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表示顏色的深淺.