使用样式表自定义Qt小部件

在使用样式表时,每个小部件被视为一个具有四个同心矩形的盒子:外边距矩形、边框矩形、内边距矩形和内容矩形。盒子模型对此进行了更详细的描述。

盒子模型

四个同心矩形的概念图如下所示:

../_images/stylesheet-boxmodel.png
  • 边距位于边框之外。

  • 边框绘制在边距和内边距之间。

  • 填充位于边框内部,在边框和实际内容之间。

  • 内容是从原始小部件或子控件中移除边距、边框和内边距后剩下的部分。

marginborder-widthpadding属性的默认值都为零。在这种情况下,所有四个矩形(marginborderpaddingcontent)完全重合。

您可以使用background-image属性为小部件指定背景。默认情况下,背景图像仅在边框内的区域绘制。可以使用background-clip属性更改此设置。您可以使用background-repeatbackground-origin来控制背景图像的重复和起始位置。

背景图片不会随着小部件的大小而缩放。要提供随小部件大小缩放的“皮肤”或背景,必须使用border-image。由于border-image属性提供了替代背景,因此在指定border-image时不需要指定background-image。在这种情况下,如果两者都指定了,border-image会绘制在background-image之上。

此外,image属性可用于在边框图像上绘制图像。指定的图像不会平铺或拉伸,当图像大小与部件大小不匹配时,使用image-position属性指定其对齐方式。与background-image和border-image不同,可以在image属性中指定SVG,在这种情况下,图像会根据部件大小自动缩放。

渲染规则的步骤如下:

  • 为整个渲染操作设置裁剪(border-radius)

  • 绘制背景 (background-image)

  • 绘制边框 (border-image, border)

  • 绘制覆盖图像(image)

子控件

一个小部件被视为一个层次结构(树),其中子控件相互叠加绘制。例如,QComboBox 绘制下拉子控件,然后是向下箭头的子控件。因此,QComboBox 的渲染方式如下:

  • 渲染 QComboBox { } 规则

  • 渲染 QComboBox::drop-down { } 规则

  • 渲染 QComboBox::down-arrow { } 规则

子控件共享父子关系。在QComboBox的情况下,下拉箭头的父级是下拉菜单,而下拉菜单的父级是小部件本身。子控件使用subcontrol-positionsubcontrol-origin属性在其父级内定位。

一旦定位,子控件可以使用盒模型进行样式设置。

注意

对于复杂的部件,如QComboBoxQScrollBar,如果自定义了一个属性或子控件,所有其他属性或子控件也必须进行自定义。