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

QT 同时被 2 个专栏收录
46 篇文章 0 订阅
342 篇文章 0 订阅

在实际应用中,常常会需要改变某个控件的颜色外观,如背景,文字颜色等,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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值