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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM