Qt删除QVBoxLayout上的小部件之间的空白空间

时间:2015-01-20 18:39:56

标签: c++ qt spacing qvboxlayout

我有烦人的问题。我创建了QVBoxLayout,我添加了我的小部件。 这是我的构造函数中的示例:

layout = new QVBoxLayout;
layout->setMargin(0);
layout->setContentsMargins(QMargins(0,0,0,0));
layout->setSpacing(0);

然后我有添加小部件的功能。

layout->addWidget(_wave);

_wave是我自己的小部件。但你可以添加你想要的任何东西,例如QButton。

我想要实现什么? Similar like this但是在窗口小部件之间没有任何空格。只是QButtons或其他小部件互相粘贴。

我添加了setMargins,setSpacing等。 请帮助我,我真的不知道该怎么做。

enter image description here

对不起颜色,但我想提一下我想要实现的目标。我有mainWindow,我在其上添加了QWidget。这个小部件有蓝色背景。然后到布局,我添加了一些小部件,在这个图像上是橙色的。我只是想确定,小部件之间的这个蓝色背景是不可见的。我希望在widget下有widget,没有任何空间。

4 个答案:

答案 0 :(得分:2)

尝试这样做可以实现紧迫的"看。请注意,如果您调整父窗口小部件的大小,它们将不会移动。不确定这是否是你想要的,但是......

// After all widgets are added to the layout
layout->insertStretch( -1, 1 );

第二个参数需要高于任何其他伸展因子。拉伸系数默认为零,所以如果你没有设置它,上面的单行应该可以工作。

答案 1 :(得分:1)

间距从不归零?

正如Qt文档所说,一些默认的GUI小部件周围有额外的框架。

QPushButton为例:

  

在某些GUI样式中,使用额外框架绘制默认按钮   围绕最多3个像素或更多。 Qt自动保留这个空间   免费的自动默认按钮,即自动默认按钮可能有一个   略大的提示。

因此,罪魁祸首不是布局,而是小部件本身。即使布局的间距设置为0,默认窗口小部件的“不可见”边距仍然存在。

Soultion

如果您确实需要“精简”布局,我的建议是使用小部件的stylesheet


实施例

以下示例说明了这个想法:

在这里,我们有一个垂直布局,边距和间距都等于0,以及带有自定义样式表的按钮:

 QPushButton {
     border: 2px solid #8f8f91;
     border-radius: 6px;
     background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                       stop: 0 #f6f7fa, stop: 1 #dadbde);
     min-width: 80px;
 }

// (further stylesheet for button click is needed)

重置样式表允许我们使布局更紧凑:

enter image description here

插入默认QPushButton以查看差异:

enter image description here

您可以看到默认QPushButton周围有空格。对于其他类型的小部件也是如此。

答案 2 :(得分:1)

我知道这个问题是在一年前发布的,但是如果它可以帮助一些人节省一些时间,我会很高兴的。我有同样的问题,并能够通过设置来解决它:

  • " QFrame.setFrameShape()"到" NoFrame"
  • " QFrame.seLineWidth()"到0。

下面的图片是2" QtextEdit"的结果。使用描述的方法并排放置在布局中。

enter image description here

http://doc.qt.io/qt-5/qframe.html#lineWidth-prop

答案 3 :(得分:0)

我可能错了,但似乎并没有一种明显的,没有黑客的方式来做你想要的。但是,根据文档,您可能会发现只需进行手动布局就可以解决您的问题。 (http://doc.qt.io/qt-5/layout.html:手动布局)

似乎可以实现一个实际提供非常紧凑的水平或垂直布局的Layout类,我相信几年前我使用Python和Qt编写了一个。考虑到这一点,您应该能够实现自己的MyCompactLayout(horizontal=True)并使用它。