使用样式表自定义Qt Widgets
使用样式表时,每个部件都被视为一个具有四个同心矩形的方框:边距矩形、边框矩形、填充矩形和内容矩形。方框模型对此有更详细的描述。
方框模型
四个同心矩形的概念如下:
- 边距位于边框之外。
- 边框位于边距和填充之间。
- 填充位于边框内,在边框和实际内容之间。
- 内容指的是去除边距、边框和填充后,原始部件或子控件所剩下的内容。
margin、border-width 和padding属性的默认值均为零。在这种情况下,所有四个矩形 (margin
,border
,padding
, 和content
) 都完全重合。
您可以使用background-image属性为 widget 指定背景。默认情况下,只在边框内的区域绘制背景图片。可以使用background-clip属性来更改。您可以使用background-repeat和background-origin 来控制背景图片的重复和原点。
背景图片不会随 widget 的大小而缩放。要提供一个能随窗口部件尺寸缩放的 "皮肤 "或背景,就必须使用border-image。由于 border-image 属性提供了另一种背景,因此在指定 border-image 时不需要指定背景图片。如果同时指定了这两个属性,则 border-image 会在 background-image 上绘制。
此外,还可以使用图像属性在 border-image 上绘制图像。指定的图像不会平铺或拉伸,当其大小与 widget 的大小不一致时,可使用image-position属性指定其对齐方式。与 background-image 和 border-image 不同,可以在图像属性中指定 SVG,在这种情况下,图像会根据 widget 的大小自动缩放。
渲染规则的步骤如下:
- 为整个渲染操作设置剪辑(border-radius)
- 绘制背景(background-image)
- 绘制边框(边框图像、边框)
- 绘制覆盖图像(图像)
子控件
一个 widget 被视为一个由子控件组成的层次结构(树形),这些子控件相互叠加。例如,QComboBox 会绘制下拉子控件,然后是下箭头子控件。因此,QComboBox 呈现如下:
- 渲染QComboBox { } 规则
- 渲染 QComboBox::drop-down { } 规则
- 渲染 QComboBox::down-arrow { } 规则
子控件共享父子关系。在QComboBox 的情况下,下拉箭头的父控件是下拉控件,而下拉控件的父控件是 widget 本身。子控件使用subcontrol-position和subcontrol-origin属性在父控件中定位。
定位后,子控件可使用框模型进行样式设计。
注: 对于QComboBox 和QScrollBar 等复杂部件,如果自定义了一个属性或子控件,则必须同时自定义所有其他属性或子控件。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.