【转】PyQt4 精彩实例分析 实例 19 利用 QPalette 改变控件颜色
在实际应用中,常常会需要改变某个控件的颜色外观,如背景,文字颜色等,Qt 提供的调色板类 QPalette
专门用于管理对话框的外观显示。本实例即通过一个具体的例子,分析如何利用 QPalette 来改变窗体中控
件的颜色。如下图所示。

QPalette 类相当于对话框或是控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含
一个 QPalette 对象,在显示时按照它的 QPalette 对象中对各部分各状态下的颜色的描述来进行绘制。就
像油漆匠的油漆计划,当要刷墙时,到计划中去查一下墙需要刷成什么颜色;当要刷门时,到计划中去查一下
门需要刷成什么颜色。采用这种方式可以很方便地对窗体的各种颜色信息进行管理。
QPalette 类有两个基本的概念,一个是 ColorGroup,另一个是 ColorRole,其中 ColorGroup 指的是 3
种不同的状态,包括以下几种。
QPalette.Active:获得焦点的状态。
QPalette.Inactive:未获得焦点的状态。
QPalette.Disable:不可用状态。
通常情况下,Active 状态与 Inactive 状态下颜色显示是一致的,当然也可根据需要设置成不一样的颜色。
ColorRole 指的是颜色主题,即对窗体中不同的部位颜色的分类,如 QPalette.Window 是指背景
色,QPalette.WindowText 指的是前景色等,由于数量较多,此处不一一列举,具体使用时可查阅 Qt 的
在线帮助。
QPalette 类使用最多,最重要的函数是 setColor()函数,其原型如下:
setColor (self, ColorRole, QColor)
setColor (self, ColorGroup, ColorRole, QColor)
第一个 setColor()函数对某个主题的颜色进行设置,并不区分状态;第二个 setColor()函数对主题颜色
进行设置的同时,还区分了状态,即对某个主题在某个状态下的颜色进行了设置。
QPalette 类同时还提供了 setBrush()函数,通过画刷的设置来显示进行更改,这样就有可能使用图片而
不仅是单一的颜色来对主题进行填充了。
Qt 之前版本中有关背景色设置的函数如 setBackgroundColor()或是前景色设置的函数如
setForegroundColor()在 Qt4 中都被废止,统一由 QPalette 类进行管理。
如 setBackgroundColor()函数可由以下语句代替:
1 xxx.setAutoFillBackground(True) 2 p=xxx.palette() 3 p.setColor(QPalette.Window,color) 4 xxx.setPalette(p)
如果并不是用单一的颜色填充背景,也可将 setColor()函数换成 setBrush()函数对背景主题进行设置。
注意要先调用 setAutoFillBackground(True)设置窗体自动填充背景。
本实例的窗体分为两个部分,一部分用于对不同主题颜色的选择,另一部分用于显示选择的颜色对于窗体外观
的改变。
具体实际代码如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 from PyQt4.QtGui import * 5 from PyQt4.QtCore import * 6 import sys 7 8 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 9 10 class Palette(QDialog): 11 def __init__(self, parent=None): 12 super(Palette, self).__init__(parent) 13 14 self.setWindowTitle(self.tr("QPalette Dialog")) 15 16 self.CreateCtrlFrame() 17 self.CreateContentFrame() 18 19 self.Layout() 20 self.ConnectSignalSlot() 21 22 def CreateCtrlFrame(self): 23 self.frame_ctrl = QFrame() 24 self.label_window = QLabel("QPalette.Window") 25 self.comboBox_window = QComboBox() 26 self.fillColorList(self.comboBox_window) 27 28 self.label_windowText = QLabel("QPalette.WindowText") 29 self.comboBox_windowText = QComboBox() 30 self.fillColorList(self.comboBox_windowText) 31 32 self.label_btn = QLabel("QPalette.Button") 33 self.comboBox_btn = QComboBox() 34 self.fillColorList(self.comboBox_btn) 35 36 self.label_btnText = QLabel("QPalette.ButtonText") 37 self.comboBox_btnText = QComboBox() 38 self.fillColorList(self.comboBox_btnText) 39 40 self.label_base = QLabel("QPalette.Base") 41 self.comboBox_base = QComboBox() 42 self.fillColorList(self.comboBox_base) 43 44 45 def CreateContentFrame(self): 46 self.frame_content = QFrame() 47 self.frame_content.setAutoFillBackground(True) 48 49 self.label_select = QLabel(self.tr("Please select a value")) 50 self.comboBox_value = QComboBox() 51 self.comboBox_value.addItem(self.tr("1")) 52 self.comboBox_value.addItem(self.tr("2")) 53 54 self.label_string = QLabel(self.tr("Please input a string")) 55 self.lineEdit_string = QLineEdit() 56 self.textEdit_text = QTextEdit(self.tr("Please input")) 57 58 self.btn_ok = QPushButton(self.tr("OK")) 59 self.btn_cancel = QPushButton(self.tr("Cancel")) 60 61 62 def Layout(self): 63 ctrlGridLayout = QGridLayout() 64 ctrlGridLayout.addWidget(self.label_window, 0, 0) 65 ctrlGridLayout.addWidget(self.comboBox_window, 0, 1) 66 ctrlGridLayout.addWidget(self.label_windowText, 1, 0) 67 ctrlGridLayout.addWidget(self.comboBox_windowText, 1, 1) 68 ctrlGridLayout.addWidget(self.label_btn, 2, 0) 69 ctrlGridLayout.addWidget(self.comboBox_btn, 2, 1) 70 ctrlGridLayout.addWidget(self.label_btnText, 3, 0) 71 ctrlGridLayout.addWidget(self.comboBox_btnText, 3, 1) 72 ctrlGridLayout.addWidget(self.label_base, 4, 0) 73 ctrlGridLayout.addWidget(self.comboBox_base, 4, 1) 74 self.frame_ctrl.setLayout(ctrlGridLayout) 75 76 hLayout = QHBoxLayout() 77 hLayout.addStretch() 78 hLayout.addWidget(self.btn_ok) 79 hLayout.addWidget(self.btn_cancel) 80 contentGridLayout = QGridLayout() 81 contentGridLayout.addWidget(self.label_select, 0, 0) 82 contentGridLayout.addWidget(self.comboBox_value, 0, 1) 83 contentGridLayout.addWidget(self.label_string, 1, 0) 84 contentGridLayout.addWidget(self.lineEdit_string, 1, 1) 85 contentGridLayout.addWidget(self.textEdit_text, 2, 0, 1, 2) 86 contentGridLayout.addLayout(hLayout, 3, 0, 1, 2) 87 self.frame_content.setLayout(contentGridLayout) 88 89 mainLayout = QHBoxLayout(self) 90 mainLayout.addWidget(self.frame_ctrl) 91 mainLayout.addWidget(self.frame_content) 92 93 def ConnectSignalSlot(self): 94 self.connect(self.comboBox_window, SIGNAL("currentIndexChanged(int)"), self.slotWindow) 95 self.connect(self.comboBox_windowText, SIGNAL("currentIndexChanged(int)"), self.slotWindowText) 96 self.connect(self.comboBox_btn, SIGNAL("currentIndexChanged(int)"), self.slotButton) 97 self.connect(self.comboBox_btnText, SIGNAL("currentIndexChanged(int)"), self.slotButtonText) 98 self.connect(self.comboBox_base, SIGNAL("currentIndexChanged(int)"), self.slotBase) 99 100 def fillColorList(self, comboBox): 101 colorList = QColor.colorNames() 102 for color in colorList: 103 pix = QPixmap(QSize(70, 20)) 104 pix.fill(QColor(color)) 105 comboBox.addItem(QIcon(pix), color) 106 comboBox.setIconSize(QSize(70, 20)) 107 comboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents) 108 109 def slotWindow(self): 110 colorList = QColor.colorNames() 111 color = QColor(colorList[self.comboBox_window.currentIndex()]) 112 p = self.frame_content.palette() 113 p.setColor(QPalette.Window,color) 114 self.frame_content.setPalette(p) 115 116 def slotWindowText(self): 117 colorList = QColor.colorNames() 118 color = QColor(colorList[self.comboBox_windowText.currentIndex()]) 119 p = self.frame_content.palette() 120 p.setColor(QPalette.WindowText, color) 121 self.frame_content.setPalette(p) 122 123 def slotButton(self): 124 colorList = QColor.colorNames() 125 color = QColor(colorList[self.comboBox_btn.currentIndex()]) 126 p = self.frame_content.palette() 127 p.setColor(QPalette.Button, color) 128 self.frame_content.setPalette(p) 129 130 def slotButtonText(self): 131 colorList = QColor.colorNames() 132 color = QColor(colorList[self.comboBox_btnText.currentIndex()]) 133 p = self.frame_content.palette() 134 p.setColor(QPalette.ButtonText, color) 135 self.frame_content.setPalette(p) 136 137 def slotBase(self): 138 colorList = QColor.colorNames() 139 color = QColor(colorList[self.comboBox_base.currentIndex()]) 140 p = self.frame_content.palette() 141 p.setColor(QPalette.Base, color) 142 self.frame_content.setPalette(p) 143 144 def main(): 145 app = QApplication(sys.argv) 146 main = Palette() 147 main.show() 148 app.exec_() 149 150 if __name__ == '__main__': 151 main()
其中,
CreateCtrlFrame()函数完成窗体左半部分颜色选择区的创建,
CreateCotentFrame()函数完成右半部分的创建,
fillColorList()函数完成向颜色下拉列表框中插入颜色的工作。
Layout() 布局
ConnectSignalSlot() 连接信号和槽
PS: 对于Button改变颜色不起作用,不知为何

浙公网安备 33010602011771号