使用样式表自定义Qt小部件¶
在使用样式表时,每个小部件被视为一个具有四个同心矩形的盒子:外边距矩形、边框矩形、内边距矩形和内容矩形。盒子模型对此进行了更详细的描述。
盒子模型¶
四个同心矩形的概念图如下所示:
![]()
边距位于边框之外。
边框绘制在边距和内边距之间。
填充位于边框内部,在边框和实际内容之间。
内容是从原始小部件或子控件中移除边距、边框和内边距后剩下的部分。
margin、border-width和padding属性的默认值都为零。在这种情况下,所有四个矩形(margin、border、padding和content)完全重合。
您可以使用background-image属性为小部件指定背景。默认情况下,背景图像仅在边框内的区域绘制。可以使用background-clip属性更改此设置。您可以使用background-repeat和background-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-position和subcontrol-origin属性在其父级内定位。
一旦定位,子控件可以使用盒模型进行样式设置。
注意
对于复杂的部件,如QComboBox和QScrollBar,如果自定义了一个属性或子控件,所有其他属性或子控件也必须进行自定义。