在实际应用中,常常会需要改变某个控件的颜色外观,如背景,文字颜色等,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()函数可由以下语句代替:
xxx.setAutoFillBackground(True)
p=xxx.palette()
p.setColor(QPalette.Window,color)
xxx.setPalette(p)
如果并不是用单一的颜色填充背景,也可将setColor()函数换成setBrush()函数对背景主题进行设置。
注意要先调用setAutoFillBackground(True)设置窗体自动填充背景。
本实例的窗体分为两个部分,一部分用于对不同主题颜色的选择,另一部分用于显示选择的颜色对于窗体外观的改变。
具体实际代码如下:
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class Palette(QDialog):
def __init__(self,parent=None):
super(Extension,self).__init__(parent)
self.setWindowTitle(self.tr("QPalette对话框"))
mainLayout=QHBoxLayout(self)
self.ctrlFrame=QFrame()
self.contentFrame=QFrame()
self.contentFrame.setAutoFillBackground(True)
self.createCtrlFrame()
self.createContentFrame()
mainLayout.addWidget(self.ctrlFrame)
mainLayout.addWidget(self.contentFrame)
def createCtrlFrame(self):
label1=QLabel("QPalette.Window")
self.windowComboBox=QComboBox()
label2=QLabel("QPalette.WindowText")
self.windowTextComboBox=QComboBox()
label3=QLabel("QPalette.Button")
self.buttonComboBox=QComboBox()
label4=QLabel("QPalette.ButtonText")
self.buttonTextComboBox=QComboBox()
label5=QLabel("QPalette.Base")
self.baseComboBox=QComboBox()
self.fillColorList(self.windowComboBox)
self.fillColorList(self.windowTextComboBox)
self.fillColorList(self.buttonComboBox)
self.fillColorList(self.buttonTextComboBox)
self.fillColorList(self.baseComboBox)
self.connect(self.windowComboBox,SIGNAL("currentIndexChanged(int)"),self.slotWindow)
self.connect(self.windowTextComboBox,SIGNAL("currentIndexChanged(int)"),self.slotWindowText)
self.connect(self.buttonComboBox,SIGNAL("currentIndexChanged(int)"),self.slotButton)
self.connect(self.buttonTextComboBox,SIGNAL("currentIndexChanged(int)"),self.slotButtonText)
self.connect(self.baseComboBox,SIGNAL("currentIndexChanged(int)"),self.slotBase)
gridLayout=QGridLayout()
gridLayout.addWidget(label1,0,0)
gridLayout.addWidget(self.windowComboBox,0,1)
gridLayout.addWidget(label2,1,0)
gridLayout.addWidget(self.windowTextComboBox,1,1)
gridLayout.addWidget(label3,2,0)
gridLayout.addWidget(self.buttonComboBox,2,1)
gridLayout.addWidget(label4,3,0)
gridLayout.addWidget(self.buttonTextComboBox,3,1)
gridLayout.addWidget(label5,4,0)
gridLayout.addWidget(self.baseComboBox)
self.ctrlFrame.setLayout(gridLayout)
def fillColorList(self,comboBox):
colorList=QColor.colorNames()
for color in colorList:
pix=QPixmap(QSize(70,20))
pix.fill(QColor(color))
comboBox.addItem(QIcon(pix),color)
comboBox.setIconSize(QSize(70,20))
comboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents)
def createContentFrame(self):
label1=QLabel(self.tr("请选择一个值"))
valueComboBox=QComboBox()
valueComboBox.addItem("1")
valueComboBox.addItem("2")
label2=QLabel(self.tr("请输入字符串"))
stringLineEdit=QLineEdit()
textEditText=QTextEdit(self.tr("请输入"))
hLayout=QHBoxLayout()
okButton=QPushButton(self.tr("确定"))
cancelButton=QPushButton(self.tr("取消"))
hLayout.addStretch()
hLayout.addWidget(okButton)
hLayout.addWidget(cancelButton)
gridLayout=QGridLayout()
gridLayout.addWidget(label1,0,0)
gridLayout.addWidget(valueComboBox,0,1)
gridLayout.addWidget(label2,1,0)
gridLayout.addWidget(stringLineEdit,1,1)
gridLayout.addWidget(textEditText,2,0,1,2)
gridLayout.addLayout(hLayout,3,0,1,2)
self.contentFrame.setLayout(gridLayout)
def slotWindow(self):
colorList=QColor.colorNames()
color=QColor(colorList[self.windowComboBox.currentIndex()])
p=self.contentFrame.palette()
p.setColor(QPalette.Window,color)
self.contentFrame.setPalette(p)
def slotWindowText(self):
colorList=QColor.colorNames()
color=QColor(colorList[self.windowComboBox.currentIndex()])
p=self.contentFrame.palette()
p.setColor(QPalette.WindowText,color)
self.contentFrame.setPalette(p)
def slotButton(self):
colorList=QColor.colorNames()
color=QColor(colorList[self.windowComboBox.currentIndex()])
p=self.contentFrame.palette()
p.setColor(QPalette.Button,color)
self.contentFrame.setPalette(p)
def slotButtonText(self):
colorList=QColor.colorNames()
color=QColor(colorList[self.windowComboBox.currentIndex()])
p=self.contentFrame.palette()
p.setColor(QPalette.ButtonText,color)
self.contentFrame.setPalette(p)
def slotBase(self):
colorList=QColor.colorNames()
color=QColor(colorList[self.windowComboBox.currentIndex()])
p=self.contentFrame.palette()
p.setColor(QPalette.Base,color)
self.contentFrame.setPalette(p)
app=QApplication(sys.argv)
main=Palette()
main.show()
app.exec_()
其中,createCtrlFrame()函数完成窗体左半部分颜色选择区的创建,createCotentFrame()函数完成右半部分的创建,fillColorList()函数完成向颜色下拉列表框中插入颜色的工作。
第24行创建一对QPalette.Window背景色的选择下拉列表框。
第34行调用fillColorList()函数向下拉列表框中插入各种不同的颜色选项。
第39行选择下拉列表框的currentIndexChanged信号与改变背景色的槽函数slotWindow()。
其他颜色选择控件的创建与此类似,这里不再重复。
第93,94行获得当前选择的颜色值。
第95行调用QWidget类的palette()函数,获得右部窗体contentFrame的调色板信息。
第96行调用QPalette类的setColor()函数,设置contentFrame窗体的Window类颜色,即背景色,setColor()的第一个参数为设置的颜色主题,第二个参数为具体的颜色值。
第97行调用QWidget的setPalette()把修改好的调色板信息应用回contentFrame窗体中,更新显示。
其他颜色选择响应槽函数与此函数类似。
slotWindowText()函数响应对文字颜色的选择,也即对前景色进行设置。
slotButton()函数响应对按钮背景色的选择。
slotButtonText()函数响应对按钮上文字颜色的选择。
slotBase()函数响应对可输入文本框背景色的选择。
fillColorList()函数用于插入颜色。
第60行调用QColor类的colorNames()函数获得Qt所有知道名称的颜色名称列表,返回的第一个字符串列表colorList。
第62-67行对颜色名称列表进行遍历。
第63行新建一个QPixmap对象pix作为显示颜色的图标。
第64行为pix填充当前遍历的颜色。
第65行调用QComboBox的addItem()函数为下拉列表框插入一个条目,并以准备好的pix作为插入条目的图标,名称设为颜色的名称。
第66行设置图标的尺寸,图标默认尺寸是一个方形,把它设置为与pix相同尺寸的长方形。
第67行调用QComboBox的setSizeAdjustPolicy()设置下拉列表框的尺寸调整策略为AdjustToContents,符合内容的大小。
注:本文基本上是经过改编的《Linux窗口程序设计--Qt4精彩实例分析》一书的PyQt4 for windows版本
转自:http://blog.csdn.net/chumpklutz/article/details/6086685