现在的位置: 首页 > 综合 > 正文

*PyQt4 精彩实例分析* 实例19 利用QPalette改变控件颜色 *PyQt4 精彩实例分析* 实例19 利用QPalette改变控件颜色

2017年09月30日 ⁄ 综合 ⁄ 共 7482字 ⁄ 字号 评论关闭

*PyQt4 精彩实例分析* 实例19 利用QPalette改变控件颜色

分类:
-- PyQt4

2537人阅读
评论(2)
收藏
举报

在实际应用中,常常会需要改变某个控件的颜色外观,如背景,文字颜色等,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)设置窗体自动填充背景。

本实例的窗体分为两个部分,一部分用于对不同主题颜色的选择,另一部分用于显示选择的颜色对于窗体外观的改变。

具体实际代码如下:

  1. # -*- coding: utf-8 -*-  
  2. from PyQt4.QtGui import *  
  3. from PyQt4.QtCore import *  
  4. import sys  
  5.   
  6. QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))  
  7.   
  8. class Palette(QDialog):  
  9.     def __init__(self,parent=None):  
  10.         super(Extension,self).__init__(parent)  
  11.         self.setWindowTitle(self.tr("QPalette对话框"))  
  12.   
  13.         mainLayout=QHBoxLayout(self)  
  14.         self.ctrlFrame=QFrame()  
  15.         self.contentFrame=QFrame()  
  16.         self.contentFrame.setAutoFillBackground(True)  
  17.         self.createCtrlFrame()  
  18.         self.createContentFrame()  
  19.         mainLayout.addWidget(self.ctrlFrame)  
  20.         mainLayout.addWidget(self.contentFrame)          
  21.   
  22.     def createCtrlFrame(self):  
  23.         label1=QLabel("QPalette.Window")  
  24.         self.windowComboBox=QComboBox()  
  25.         label2=QLabel("QPalette.WindowText")  
  26.         self.windowTextComboBox=QComboBox()  
  27.         label3=QLabel("QPalette.Button")  
  28.         self.buttonComboBox=QComboBox()  
  29.         label4=QLabel("QPalette.ButtonText")  
  30.         self.buttonTextComboBox=QComboBox()  
  31.         label5=QLabel("QPalette.Base")  
  32.         self.baseComboBox=QComboBox()  
  33.   
  34.         self.fillColorList(self.windowComboBox)  
  35.         self.fillColorList(self.windowTextComboBox)  
  36.         self.fillColorList(self.buttonComboBox)  
  37.         self.fillColorList(self.buttonTextComboBox)  
  38.         self.fillColorList(self.baseComboBox)  
  39.         self.connect(self.windowComboBox,SIGNAL("currentIndexChanged(int)"),self.slotWindow)  
  40.         self.connect(self.windowTextComboBox,SIGNAL("currentIndexChanged(int)"),self.slotWindowText)  
  41.         self.connect(self.buttonComboBox,SIGNAL("currentIndexChanged(int)"),self.slotButton)  
  42.         self.connect(self.buttonTextComboBox,SIGNAL("currentIndexChanged(int)"),self.slotButtonText)  
  43.         self.connect(self.baseComboBox,SIGNAL("currentIndexChanged(int)"),self.slotBase)  
  44.           
  45.         gridLayout=QGridLayout()  
  46.         gridLayout.addWidget(label1,0,0)  
  47.         gridLayout.addWidget(self.windowComboBox,0,1)  
  48.         gridLayout.addWidget(label2,1,0)  
  49.         gridLayout.addWidget(self.windowTextComboBox,1,1)  
  50.         gridLayout.addWidget(label3,2,0)  
  51.         gridLayout.addWidget(self.buttonComboBox,2,1)  
  52.         gridLayout.addWidget(label4,3,0)  
  53.         gridLayout.addWidget(self.buttonTextComboBox,3,1)  
  54.         gridLayout.addWidget(label5,4,0)  
  55.         gridLayout.addWidget(self.baseComboBox)  
  56.   
  57.         self.ctrlFrame.setLayout(gridLayout)  
  58.   
  59.     def fillColorList(self,comboBox):  
  60.         colorList=QColor.colorNames()  
  61.           
  62.         for color in colorList:  
  63.             pix=QPixmap(QSize(70,20))  
  64.             pix.fill(QColor(color))  
  65.             comboBox.addItem(QIcon(pix),color)  
  66.             comboBox.setIconSize(QSize(70,20))  
  67.             comboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents)  
  68.           
  69.     def createContentFrame(self):  
  70.         label1=QLabel(self.tr("请选择一个值"))  
  71.         valueComboBox=QComboBox()  
  72.         valueComboBox.addItem("1")  
  73.         valueComboBox.addItem("2")  
  74.         label2=QLabel(self.tr("请输入字符串"))  
  75.         stringLineEdit=QLineEdit()  
  76.         textEditText=QTextEdit(self.tr("请输入"))  
  77.         hLayout=QHBoxLayout()  
  78.         okButton=QPushButton(self.tr("确定"))  
  79.         cancelButton=QPushButton(self.tr("取消"))  
  80.         hLayout.addStretch()  
  81.         hLayout.addWidget(okButton)  
  82.         hLayout.addWidget(cancelButton)  
  83.         gridLayout=QGridLayout()  
  84.         gridLayout.addWidget(label1,0,0)  
  85.         gridLayout.addWidget(valueComboBox,0,1)  
  86.         gridLayout.addWidget(label2,1,0)  
  87.         gridLayout.addWidget(stringLineEdit,1,1)  
  88.         gridLayout.addWidget(textEditText,2,0,1,2)  
  89.         gridLayout.addLayout(hLayout,3,0,1,2)  
  90.         self.contentFrame.setLayout(gridLayout)  
  91.   
  92.     def slotWindow(self):  
  93.         colorList=QColor.colorNames()  
  94.         color=QColor(colorList[self.windowComboBox.currentIndex()])  
  95.         p=self.contentFrame.palette()  
  96.         p.setColor(QPalette.Window,color)  
  97.         self.contentFrame.setPalette(p)  
  98.   
  99.     def slotWindowText(self):  
  100.         colorList=QColor.colorNames()  
  101.         color=QColor(colorList[self.windowComboBox.currentIndex()])  
  102.         p=self.contentFrame.palette()  
  103.         p.setColor(QPalette.WindowText,color)  
  104.         self.contentFrame.setPalette(p)  
  105.   
  106.     def slotButton(self):  
  107.         colorList=QColor.colorNames()  
  108.         color=QColor(colorList[self.windowComboBox.currentIndex()])  
  109.         p=self.contentFrame.palette()  
  110.         p.setColor(QPalette.Button,color)  
  111.         self.contentFrame.setPalette(p)  
  112.   
  113.     def slotButtonText(self):  
  114.         colorList=QColor.colorNames()  
  115.         color=QColor(colorList[self.windowComboBox.currentIndex()])  
  116.         p=self.contentFrame.palette()  
  117.         p.setColor(QPalette.ButtonText,color)  
  118.         self.contentFrame.setPalette(p)  
  119.   
  120.     def slotBase(self):  
  121.         colorList=QColor.colorNames()  
  122.         color=QColor(colorList[self.windowComboBox.currentIndex()])  
  123.         p=self.contentFrame.palette()  
  124.         p.setColor(QPalette.Base,color)  
  125.         self.contentFrame.setPalette(p)  
  126.   
  127. app=QApplication(sys.argv)  
  128. main=Palette()  
  129. main.show()  
  130. 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,符合内容的大小。

抱歉!评论已关闭.