101个Qt样式表边距填充黑科技指南(使用C++)。设置填充无效。

3

经过数月的研究和询问,我发现了一种解决方案,可以将边距重置为0,将填充重置为0,在qt中使用样式表对小部件进行样式化,并从头开始设计。

使用qt4样式表风格化小部件边距/填充的101指南

  • 创建任何类型的BoxModel可样式化小部件(不要使用QWidget,而是使用QFrame!)查看文档
  • 将普通布局分配给它。
  • 如果您不想要默认边距(大约为8px左右),则必须将布局(而不是小部件,您可以,但不起作用)内容边距设置为0:setContentsMargins(0,0,0,0)
  • 可选地(我不知道哪些情况),将间距设置为0,以将所有内容重置为极端状态(无边框,完全没有):setSpacing(0)
  • 将小部件对象名称设置为自定义名称:setObjectName("name")
  • 通过您的小部件设置样式更改QFrame:QFrame#name { things... }
如果您想为自定义小部件添加样式,并且您有一个自定义类名,而且您打算使用类的名称而不是使用setObjectName方法,请添加这个小技巧来重新实现您的paint方法。该方法包含在Qt样式表文档示例中。

If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:

void CustomWidget::paintEvent(QPaintEvent *)
 {
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

The above code is a no-operation if there is no stylesheet set.

Warning: Make sure you define the Q_OBJECT macro for your custom widget.

然后您可以使用类名创建样式。ClassName {}
现在,我有一个严重的问题,我与其他人分享了这个问题,但是我没有解决方案。 填充根本不起作用,只有外边距有效。 所以,
ClassName
{ padding: 200px; margin: 5px; }

与...相同

ClassName
{ margin: 5px; }

这就带来了一个烦恼的局面,当你必须使用边距创建子容器以添加填充时。这会导致无限层级...这一点都不理想。
有人知道如何完全完成我的101指南吗?

你的 ClassName 类,是 QFrame 的子类吗? - thuga
不是的,它是一个QFrame#name。 - Darkgaze
那里有什么问题吗?可能是答案? - Darkgaze
2
文档中关于填充的说明如下:此属性由QAbstractItemView子类、QAbstractSpinBox子类、QCheckBoxQComboBoxQFrameQGroupBoxQLabelQLineEditQMenuQMenuBarQPushButtonQRadioButtonQSplitterQTextEditQToolTip支持。因此,我认为您不能将其用于自定义的QWidget子类。 - hank
我知道这一点,但没有意识到我的小部件是QWidget子类,而不是我在帖子中说的QFrame。:-D 我10分钟前发现了它!但还是谢谢! - Darkgaze
1个回答

2

填充有效

我的问题来自于我用于检查填充是否有效的类。它是QWidget的子类,正如文档清楚地指出的:

仅支持背景、background-clip和background-origin属性。

因此,我的背景属性有效,但我不明白为什么填充无效。

所以,我在不知不觉中回答了自己的问题。


1
你不小心搞砸了问答模型,这很令人困惑。请删除编辑内容,明确提出问题,并将答案放在回答帖子中。为了易读性。 - ManuelSchneid3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接