【转】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改变颜色不起作用,不知为何

posted @ 2014-11-19 10:33  jakey.chen  阅读(950)  评论(0)    收藏  举报