Qt提供了三种方法来重新定义Qt内置窗口部件的外观
- 子类化个别的窗口部件类,并且重新实现它的绘制和鼠标事件处理器,这会给我们完全的可控性,可是需要付出大量的工作。这意味着必须遍历所有的代码,把Qt所有相关的类都改成子类。
- 子类化一个QStyle或者一个预定义的风格。
- 使用样式表
样式表由影响窗口部件绘制的样式组成,它是在运行时解析的。最简单的例子
QLineEdit{
background-color:yellow;
}
QLineEdit被称为选择器,background-color是属性,yellow是值。使用样式表比修改窗口部件的调色板更可靠些,因为它可以保证无论激活的是哪种样式,都可以使用指定的颜色,而调色板的实体在不同的样式用法是不一样的。调色板包含了部件各种状态的颜色组,一个调色板包含仨种状态,激活,失效,非激活。激活用于获得键盘焦点的窗口,非激活用于其他没有获得键盘焦点的窗口。Qt中的所有部件都含有一个调色板,并且使用各自的调色板来绘制它们自身,这样可以使用用户界面更容易配置,也更容易保持一致。
部件有效的样式表是通过部件祖先的样式表和QApplication上的样式表合并得到的。不过颜色和字体不会继承父类的
QSS通常不区分大小写(即:color、Color、COLOR、cOloR指同一属性),唯一例外就是类名(class names)、对象名(object names)、属性名(property names)区分大小写。对于QSS的计算,所有的类型选择具有相同的特殊性,最后出现的规则优先。使用QSS时,部件不会自动从父继承字体和颜色。从4.3及以后,任何可被识别的Q_PROPERTY都可以使用qproperty-<property name>
语法设置。
MyLabel { qproperty-pixmap: url(pixmap.png); }
MyGroupBox { qproperty-titleColor: rgb(100, 200, 100); }
QPushButton { qproperty-iconSize: 20px 20px; }
如果想给OK按钮指定前景颜色可以
QPushButton[text="OK"]{
color:green;
}
匹配的规则,可以和动态属性系统配合使用
选择器 | 实例 | 可以配匹配的窗口部件 |
全局对象 | * | 任意窗口部件 |
类型 | QDial | 给定类的实例,包括子类 |
类 | .QDial | 给定类的实例,不包括子类 |
标识 | QDial#ageDial | 给定对象名称的窗口部件 |
Qt属性 | QDial[y="0"] | 为某些属性赋值的窗口部件 |
子对象 | QFrame>QDial | 给定窗口部件的直接子窗口部件 |
子孙对象 | QFrame QDial | 给定窗口部件的子孙窗口部件 |
支持的一些辅助控制器
辅助 控制器 | 说明 |
::indicator | 复选框,单选钮,可选菜单项或可选群组框的指示器 |
::menu-indicator | 按钮的菜单指示器 |
::item | 菜单,菜单栏或状态栏项 |
::up-button | 微调框或滚动条的向上按钮 |
::down-button | 微调框或滚动条的向下按钮 |
::up-arrow | 微调框,滚动条,或标题视图的向上箭头 |
::down-arrow | 微调框,滚动条,标题视图或组合框的向下箭头 |
::drop-down | 组合框的下拉箭头 |
::title | 群组框的标题 |
使用动态属性方式有局限性。最主要的是,当一个属性值变化时,所引用的样式不会自动更新。相反地,必须手动触发更新才会生效。unpolish()用于清理之前的样式,而polish()则用于添加新的样式。
myLineEdit->setProperty("urgent", true);
myLineEdit->style()->unpolish(myLineEdit);
myLineEdit->style()->polish(myLineEdit);
状态由单个冒号决定,而辅助控制器由两个冒号指定,当一个接一个地列出几个状态,彼此用冒号隔开,这种情况下要当窗口部件满足所有的状态时,规则才被使用如:
QCheckBox:checked:hover{
color:white;
}
如果想满足其中任何一个就使用规则,那么用逗号把他们隔开,如
QCheckBox:hover,QCheckBox:checked{
color:white;
}
可用的样式表状态
状态 | 说明 |
:disabled | 禁用窗口部件 |
:enabled | 启用窗口部件 |
:focus | 窗口部件有输入焦点 |
:hover | 鼠标在窗口部件上悬停 |
:pressed | 鼠标按键点击窗口部件 |
:checked | 按钮已被选中 |
:unchecked | 按钮未被选中 |
:indeterminate | 按钮被部分选中 |
:open | 窗口部件位于打开或扩展状态 |
:closed | 窗口部件位于关闭或销毁状态 |
:on | 窗口部件的状态时"on" |
:off | 窗口部件的状态时"off" |
QStyle提供了一种包装应用程序的方法。在现存的样式上,我们做最少的修改,或者可以从无到有创建一种完全自定义的样式。QStyle典型地带有QStyleOption对象,它包含绘制窗口部件的通用信息以及特有信息,还包含一个QWidget指针,以应对QStyleOption不能提供全部所需的信息。QStyleOption::initFrom()函数初始化用于显示窗口部件的基本成员变量,具有特性的QStyleOptionButton的成员变量必须被手动初始化。QWidget::style()函数返回绘制窗口部件的合适样式
QStyleFactory类可以创建一个QStyle对象,首先通过keys()函数获取可用的风格,然后使用create()函数创建一个QStyle对象