注意:不要把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() { }