【问题标题】:101 Qt stylesheet margins padding hack guide in C++. Setting padding doesn't workC++ 中的 101 个 Qt 样式表边距填充 hack 指南。设置填充不起作用
【发布时间】:2014-02-03 22:12:10
【问题描述】:

经过几个月的研究并在这里询问,我找到了将边距重置为 0 并将填充设置为 0 的解决方案,对小部件进行样式化,并使用 qt 中的样式表从头开始设计。 小部件必须是其他东西的容器

101 使用 qt4 中的样式表设置小部件边距/填充样式的指南

  • 创建任何类型的 BoxModel 样式小部件(不是QWidget,而是使用QFrame!)。 Check documentation
  • 为其分配正常布局。
  • 如果您不想要默认的边距,它们像 apox 一样大。 8px 或多或少,您必须将布局(不是小部件,您可以,但不起作用)内容边距设置为 0:setContentsMargins(0,0,0,0)
  • (我不知道是哪种情况)可选(我不知道是哪种情况),将所有内容都设置为极端重置(没有边框,什么都没有),也将间距设置为 0。 setSpacing(0)
  • 将小部件对象名称设置为自定义名称:setObjectName("name")
  • 通过您的小部件设置您的样式更改 QFrame:QFrame#name { things... }

如果您想对自定义小部件进行样式化,并且您有一个自定义类名,并且您打算使用类的名称而不是使用setObjectName,请添加这个小技巧重新实现您的绘制方法,包含在 Qt 样式表文档示例中。

如果你从 QWidget 继承,你需要为 您的自定义 QWidget 如下:

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

如果没有设置样式表,上面的代码是无操作的。

警告:确保为您的自定义定义 Q_OBJECT 宏 小部件。

然后您可以使用类名创建样式。 ClassName {}


现在,我与其他人分享了一个严重的问题,但我没有解决方案。 填充根本不起作用。只有边距有效。

所以

ClassName
{ padding: 200px; margin: 5px; }

做同样的事情

ClassName
{ margin: 5px; }

当您必须创建带有边距的子容器 来添加填充时,这会带来麻烦的情况。这给我们带来了无限的等级制度……这根本不合意。

有人知道如何完成我的 101 指南吗?

【问题讨论】:

  • 这个ClassName 你的班级。它是QFrame 的子类吗?
  • 不。这是一个 QFrame#name
  • 有什么问题吗?可能是答案吗?
  • 文档对填充这样说:此属性受 QAbstractItemView 子类、QAbstractSpinBox 子类、QCheckBoxQComboBoxQFrameQGroupBoxQLabel 支持, QLineEdit、QMenu、QMenuBarQPushButtonQRadioButtonQSplitterQTextEditQToolTip。所以我认为你不能将它用于自定义 QWidget 子类。
  • 我知道但没有意识到我的小部件是 QWidget 子类,而不是 QFrame,这就是我在帖子中所说的。 :-D 我在 10 分钟前找到了它!不过谢谢!

标签: c++ qt qt4 stylesheet qtstylesheets


【解决方案1】:

填充工作

我的问题来自我用来检查填充不起作用的类。它是 QWidget 的一个子类,正如文档中明确指出的那样:

仅支持背景、背景剪辑和背景来源 属性。

所以我的背景属性正在工作,我不明白为什么填充没有。

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

【讨论】:

  • 不知何故你搞砸了问答模型。这很令人困惑。删除编辑,陈述一个明确的问题,将答案放在答案帖子中。为了便于阅读。