qt--调色板QPalette

注意:不要把QPalette与 Qt 样式表联合使用

在实际的应用中,经常需要对某个控件的颜色外观,如背景、前景色等,进行设置。

Qt中提供的调色板QPalette类就是专门用于管理控件的外观显示。QPalette类相当于对话框或控件的调色板,管理着控件和窗体的所有颜色

每个窗体和控件都包含一个QPalette对象,在显示时,对其做相应的设置即可 

QWidget 会把调色板角色从父级传播到子级,除非启用了 Qt::WA_WindowPropagation 属性(使用 QWidget::setAttribute()函数设置) ,否则默认情况下调色板不会传播到窗口
因某些样式依赖于第三方 API(比如 Mac 样式、windows vista 样式等),而这些样式并不一定遵循调色板,因此不能保证部件的调色板分配角色会改变部件的外观。此时可使用样式表
还可以使用 QApplication::setPalette();静态函数设置整个应用程序的默认调色板

QPalette有两个基本的概念:一个是ColorGroup;一个是ColorRole

ColorGroup有三种不同的状态:

  QPalette::Active=0     激活状态(具有键盘焦点的窗口)
  QPalette::Disabled=1     被禁用的部件(而不是窗口)
  QPalette::Inactive=2        未激活状态(非活动)

QPalette::Normal            同 Active

ColorRole:

常量 Value 备注
QPalette::Window 10 一般的背景色
QPalette::Background Window
已过时,同 Window
QPalette::WindowText 0 一般的前景色
QPalette::Foreground WindowText
已过时,同 WindowText
QPalette::Base 9 主要用作文本输入小部件的背景色,但也可用于其他绘制-例如组合框下拉列表和工具栏的背景。通常是白色或其他浅色
QPalette::AlternateBase 16
用于视图中带有交替行颜色的备用背景色,详见
QAbstractItemView::setAlternatingRowColors();函数的详解
QPalette::ToolTipBase 18
QToolTip 和 QWhatsThis 的背景色,QToolTip 使用 QPalette 的非活动颜色组,因为工具提示不是活动窗口
QPalette::ToolTipText 19 用作QToolTip和QWhatsThis的前景色
QPalette::PlaceholderText 20 用作各种文本输入小部件的占位符颜色。这个枚举值已经在Qt 5.12中引入
QPalette::Text 6
与 Base 一起使用的前景色,通常与 WindowText 相同,Text 通常用于文本,但也可用于线条、图标等
QPalette::Button 1 普通按钮背景色
QPalette::ButtonText 8
与 Button 一起使用的前景色
QPalette::BrightText 7 一种与WindowText非常不同的文本颜色,与深色的对比度很好。通常用于需要在文本或窗口文本的对比度较差的地方绘制的文本,例如在按下的按钮上。请注意,文本颜色可以用于除单词之外的其他内容;文本颜色通常用于文本,但是将文本颜色角色用于行、图标等是相当常见的
QPalette::NoRole
17
无角色
以下枚举用于 3D 效果,比如使按钮看更有立体感等,以下枚举依赖于 Window
QPalette::Light
2
比 Button 的颜色更亮
QPalette::Midlight
3
在 Button 和 Light 之间
QPalette::Dark
4
比 Button 的颜色更暗
QPalette::Mid
5
在 Button 和 Dark 之间
QPalette::Shadow
11
阴影颜色,这是一个很深的颜色,默认使用 Qt::black(黑色)
以下枚举用于选择项目时的颜色
QPalette::Highlight
12
突出显示所选内容,默认颜色为 Qt::darkBlue(深蓝)
QPalette::HighlightedText
13
突出显示时的文本颜色,默认颜色为 Qt::white(白色)
以下枚举与超链接有关,注意:富文本不会使用以下枚举值
QPalette::Link 
14
未访问的超链接的颜色,默认为 Qt::blue(蓝色)
QPalette::LinkVisited
15
已访问过的超链接的颜色,默认为 Qt::magenta(洋红)

 

实例一 

    QLabel* label=new QLabel("标签",this);
    label->move(10,10);
    label->resize(300,200);
    label->setAutoFillBackground(true); //是否自动填充控件的背景
    //如果启用,此属性将导致Qt在调用paint事件之前填充小部件的背景。使用的颜色由小部件的调色板QPalette来决定
    QPalette palette ;  //创建调色板对象
    palette=label->palette();  //返回控件的调色板
    palette.setColor(QPalette::Window, Qt::yellow);  //设置颜色
    //参数1:ColorRole枚举值   决定设置哪个地方的颜色
    //参数2:要设置的颜色

    palette.setColor(QPalette::WindowText, Qt::blue);

    label->setPalette(palette);  //控件使用调色板
    //如果setAutoFillBackground为true,控件的背景色马上发生变化
    //前景色不受setAutoFillBackground的影响

实例二 

    QLabel* label=new QLabel("标签",this);
    label->move(10,10);
    label->resize(300,200);
    label->setAutoFillBackground(true); 
    QPalette palette ;  
    palette=label->palette();  

    QPixmap p;
    p.load("./tu.jpg");
    palette.setBrush(QPalette::Window,p);  //给控件设置背景图


    palette.setColor(QPalette::WindowText, Qt::blue);

    label->setPalette(palette);  

实例三

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
    this->resize(400,300);

    QPushButton *pb1=new QPushButton("AAA",this);
    pb1->move(22,22);
    QPushButton *pb2=new QPushButton("BBB",this);
    pb2->move(111,22);
    QLabel *pl=new QLabel("CCC",this);
    pl->move(22,55);
    QLineEdit *pe=new QLineEdit("DDD",this);
    pe->move(99,55);
    QComboBox *px=new QComboBox(this);
    px->move(266,55);
    px->addItem("EEE"); px->addItem("FFF");
    QPlainTextEdit *pt=new QPlainTextEdit("GGGGG",this);
    pt->move(22,88);

    //设置调色板各颜色角色的颜色
    QPalette p;
    p.setColor(QPalette::Window,QColor(111,1,1)); //①、背景色
    p.setColor(QPalette::WindowText,QColor(1,111,1)); //②、前景色
    p.setColor(QPalette::Base,QColor(111,111,1)); //③、文字输入部件背景色
    p.setColor(QPalette::Text,QColor(111,1,111)); //④、基于 Base 的前景色
    p.setColor(QPalette::Button,QColor(1,255,111)); //⑤、按钮背景色

    p.setColor(QPalette::ButtonText,QColor(255,255,0));//⑥、基于 Button 的前景色
    p.setColor(QPalette::Highlight,QColor(255,255,255)); //⑦、突出显示的颜色
    p.setColor(QPalette::HighlightedText,QColor(1,1,255)); //⑧、突出显示的文本颜色
    p.setColor(QPalette::Light,QColor(1,1,255));
    //以下颜色用于设置部件的 3D 效果。
     p.setColor(QPalette::Dark,QColor(255,1,255)); //
     p.setColor(QPalette::Shadow,QColor(255,1,255));//
     this->setPalette(p);

}

Win::~Win()
{
}

原文地址:https://www.cnblogs.com/liming19680104/p/13885129.html