如何完全删除 QLayout 的边距(特定于 Mac OS)

Posted

技术标签:

【中文标题】如何完全删除 QLayout 的边距(特定于 Mac OS)【英文标题】:How to remove margins of QLayout completely (Mac OS specific) 【发布时间】:2017-01-03 21:17:35 【问题描述】:

让我解释一个简化的情况。在 Qt Creator 中,创建一个包含 QPushButtonQHBoxLayout 和另一个包含第二个 QPushButtonQHBoxLayout(即嵌套布局)。如下所示:

QHBoxLayouts 的四个边距(左、上、右、下)的值为 0。我希望布局的边界(附加图像中的红色矩形)完美地位于两个按钮的边界上,并且两个按钮垂直对齐。然而,从图片中可以看出,情况显然并非如此。第二个按钮比第一个按钮高一点。事实上,将下边距设置在 0 和 8 之间并没有视觉上的差异,下边距仅从 9 个像素开始增长,至少在 Mac OS 上是这样。

对这种行为有什么解释吗?以及如何完全删除边距而不是调用layout->setContentsMargins(0,0,0,0)

我知道QStyle::PixelMetric 中的QStyle::PM_LayoutBottomMargin 等,这应该是特定平台上的默认底部边距。但是为什么layout->setContentsMargins(0,0,0,0) 不会覆盖这些值呢?

编辑:我只是在 Windows 上尝试了同样的方法,确实一切都如预期的那样(没有边距)。所以这个问题只能在 Mac OS 上重现。

【问题讨论】:

您指的是 Qt Designer 中的正确方法,还是代码中的正确方法? setContentsMargins(0,0,0,0) 适合代码,否则,使用 Qt Creator 中的属性窗口进行适当的布局,将边距设置为 0。 当我构造同样的东西时,我没有看到这个问题。事实上,我的默认内容边距已经为零。你能发布 .ui 文件吗? @owacoder,实际上我指的是两者。我通过设置setContentsMargins(0,0,0,0)在我的代码中发现了这个问题,后来在Qt Designer中尝试了将边距属性设置为0后给出了相同的结果。 @goug 你也在 Mac OS 上工作吗?这种特殊情况可能存在平台差异。根据我在 Mac 上的尝试,即使通过代码或在 Qt Designer 中将其设置为零,下边距也始终至少为 8 像素。我不允许上传文件,但 .ui 就像问题中描述的一样简单。顺便说一句,0 值的边距确实是默认值,但显然 0 值没有效果,如屏幕截图所示。 我在 Windows 上。我没有在家里的 Mac 上设置开发环境。我看到有人发布了错误报告和解决方法,希望对您有所帮助。 【参考方案1】:

此问题仅对 Mac OS 上的某些特定小部件(例如 QPushButtonQComboBox 等)可见。

在这些小部件上设置Qt::WA_LayoutUsesWidgetRectattribute 将解决它:

button->setAttribute(Qt::WA_LayoutUsesWidgetRect);

参考:QMacStyle: QPushButtons always have space below when in a QLayout

可以在此处找到具有相同解决方案的相关问题:Why is QHBoxLayout causing widgets to overlap?

【讨论】:

以上是关于如何完全删除 QLayout 的边距(特定于 Mac OS)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vuetify 中使用断点为不同的屏幕尺寸指定不同的边距

接收焦点时如何删除添加到TextField中具有prefixIcon的标签的边距?

如何删除正文周围的边距空间或清除默认 CSS 样式

如何在 Matplotlib 中扩展图形底部的边距?

特定于浏览器的 CSS 样式

CSS 删除第一个/最后一个元素的边距