如何正确使用QLayouts(hbox,vbox等)?

时间:2018-09-24 21:37:06

标签: c++ qt

我正在基于QGraphicsWidget

构建自定义窗口小部件

在小部件内,我需要与窗口大小一致的其他各种小部件。为此,我正在使用

Layout = new QGraphicsLinearLayout();
Layout->setOrientation(Qt::Horizontal);
setLayout(Layout);

所以我有一个布局,并且在布局的每一侧都有一个小部件。因此,左侧是小部件,右侧是小部件。

 QGraphicsLinearLayout() below

      500 px wide x
|--------------------------------| 
|                                |
|left widget         right widget|   100 px tall y
|--------------------------------|

我想要的行为是,当窗口变大时,小部件将停留在边缘的x像素之内。因此,如果将窗口调整为10,000像素宽,则左窗口小部件将始终距离左边缘1像素,而右窗口小部件将始终距离右边缘1像素。

                10000 px wide x
|---------------------------------------------------| 
|                                                   |
|left widget                            right widget|   100 px tall y
|---------------------------------------------------|

当前行为是,左窗口小部件将留在原处且永不移动,而右窗口小部件将从右边缘移开。

为实现此行为,我尝试了以下操作:

Layout->setAlignment(leftWidget, Qt::AlignLeft);

那绝对不起作用。

我也尝试过

Layout->addItem(leftWidget);

Layout->setStretchFactor(leftWidget, 0);

Layout->addItem(rightWidget);

可以达到预期效果,但是将rightWidget与边框重叠

      500 px wide x
|--------------------------------| 
|                                |
|left widget                 right widget   100 px tall y
|--------------------------------|

那我怎样才能得到我想要的行为?到目前为止,QLayouts似乎非常令人困惑,并且该API具有误导性。

1 个答案:

答案 0 :(得分:0)

解决方案

在左侧和右侧小部件之间使用QGraphicsLinearLayout::addStretch以便将它们保持在侧面,并在QGraphicsLayout::setContentsMargins上添加小部件和边缘之间的空间:

lis1= ('orange','strawberry','strawberry','strawberry','orange','orange','orange','strawberry')
lis2= ("lorem ipsum review","lorem ipsum review", "lorem ipsum review","lorem ipsum review","lorem ipsum review","lorem ipsum review","lorem ipsum review","lorem ipsum review")

pd.DataFrame({'category':lis1, 'review': lis2})

     category              review
0      orange  lorem ipsum review
1  strawberry  lorem ipsum review
2  strawberry  lorem ipsum review
3  strawberry  lorem ipsum review
4      orange  lorem ipsum review
5      orange  lorem ipsum review
6      orange  lorem ipsum review
7  strawberry  lorem ipsum review

示例

我为您准备了一个使用示例解决方案的最小示例:

auto *l = new QGraphicsLinearLayout();

l->addItem(leftProxy);
l->addStretch();
l->addItem(rightProxy);
l->setContentsMargins(25, 1, 1, 1);
l->setSpacing(1);