自定义外观

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"
特别的 如果要子类化一个QWidget,为了能够使用样式表,则需要提供paintEvent事件。这是因为QWidget的paintEvent()是空的,而样式表要通过paint被绘制到窗口中。


QStyle提供了一种包装应用程序的方法。在现存的样式上,我们做最少的修改,或者可以从无到有创建一种完全自定义的样式。QStyle典型地带有QStyleOption对象,它包含绘制窗口部件的通用信息以及特有信息,还包含一个QWidget指针,以应对QStyleOption不能提供全部所需的信息。QStyleOption::initFrom()函数初始化用于显示窗口部件的基本成员变量,具有特性的QStyleOptionButton的成员变量必须被手动初始化。QWidget::style()函数返回绘制窗口部件的合适样式

QStyleFactory类可以创建一个QStyle对象,首先通过keys()函数获取可用的风格,然后使用create()函数创建一个QStyle对象

猜你喜欢

转载自blog.csdn.net/weixin_38893389/article/details/81042288