删除 QGridLayout 中的所有间距

Posted

技术标签:

【中文标题】删除 QGridLayout 中的所有间距【英文标题】:Remove all spacing in QGridLayout 【发布时间】:2010-02-04 22:20:01 【问题描述】:

我正在尝试以编程方式(使用 Qt 4.6)构建一个包含一系列 QPushButton 的窗口,所有这些都打包在一起。它应该看起来像这样(我称之为工具箱):

toolbox image http://img99.imageshack.us/img99/9853/examplezk.png

所以,我创建了一个从 QWidget 派生的 Toolbox 类,它具有以下构造函数:

Toolbox::Toolbox (void)
  : QWidget (0, Qt::Tool)

  setWindowTitle (tr ("Toolbox"));

  QGridLayout *group = new QGridLayout (this);
  group->setSpacing (0);
  group->setContentsMargins (0, 0, 0, 0);
  group->setSizeConstraint (QLayout::SetFixedSize);
  setLayout (group);

  unsigned k = 0;
  QPushButton *buttons = new QPushButton[6];
  for (unsigned i = 0; i < 3; i++)
    for (unsigned j = 0; j < 2; j++)
    
      buttons[k].setIcon (QIcon ("test.png"));
      buttons[k].setIconSize (QSize (32, 32));
      buttons[k].setContentsMargins (0, 0, 0, 0);
      buttons[k].setCheckable (true);
      buttons[k].setAutoExclusive (true);

      group->addWidget (&buttons[k], i, j);
      k++;
    
  buttons[1].setChecked (true);

不知何故,它不起作用,我的按钮最终没有打包在一起:

result http://img9.imageshack.us/img9/774/resultr.png

我无法移除这个垂直间距(以及整个阵列周围的边距)。欢迎任何帮助。

【问题讨论】:

【参考方案1】:

显然,这被认为是正常的事情:见相应的bug report,已关闭。报告的解决方法似乎对我不起作用。

【讨论】:

链接已失效。【参考方案2】:

由于您已将布局的大小约束设置为QLayout::SetFixedSize,Qt 将使用小部件的大小提示作为其固定大小。您可能必须在 Toolbox 类中覆盖 QWidget::sizeHint() 以使小部件完全符合所有按钮所需的大小(在您的六个按钮的情况下,宽度为 64,高度为96)。

【讨论】:

哼,怕是起不了作用。我添加了一个 Toolbox::sizeHint(),但它没有被调用。 Toolbox::sizeHint() 在我尝试时被调用。当我忘记将其设为 const 成员函数时,它不会被调用。您可能还必须按照 PiedPiper 的建议更改样式。 好吧,对了,又是一个编辑编译不同文件的案例,不好意思。 (不过,我得到了const 的权利。)但是,即使被调用,它也可以让它返回我想要的任何 QSize,而且我根本不会改变外观。最后,关于设置样式,如果我这样做,则不需要其他技巧(但它很难看)。【参考方案3】:

如果您使用的是现在 Qt4.6 中标准的 plastique 样式,则 QPushButtons 的边框将在小部件内绘制。尝试使用其他样式之一。例如:

#include <QGtkStyle>

QApplication a(argc, argv, true);
a.setStyle("gtk");

还可以使用 QWidget::setStyle() 函数在单个小部件上设置样式。

【讨论】:

我正在使用 Mac OS,所以我没有使用 plastique。实际上,将样式设置为 plastique 可以将小部件绘制在一起。然而,这给了他们一种外星人的外观,所以我仍然欢迎使用原生类型的解决方案。

以上是关于删除 QGridLayout 中的所有间距的主要内容,如果未能解决你的问题,请参考以下文章

使用与具有不同列数的另一个QGridLayout相同的列间距

如何从 QGridLayout 中的单元格中删除小部件

QGridLayout 不会返回其所有子小部件

强制删除 Qt 中的所有水平间距

PyQt:QGridLayout 中的 setSpacing

R Shiny CSS:删除特定行之间的空间,同时保持所有其他间距不变