QGridLayout 3x3网格调整小部件

时间:2017-06-11 15:16:22

标签: c++ qt qgridlayout

我有9个QWidgets。有时他们是看不见的。它们都是3x3网格。

[0][3][6]
[1][4][7]
[2][5][8]

现在,如果小部件3变得不可见,则其他小部件应该调整大小:

[   0   ][   6   ]
[  1 ][  4 ][  7 ]
[  2 ][  5 ][  8 ]

同样应该垂直发生,基本上所有空的空间都应该填补,但我不知道该怎么做。当我将窗口小部件设置为不可见时,不会占用空白区域。

QGroupBox *parent = getParent();
QGridLayout *layout = new QGridLayout;
layout->setMargin(0);
layout->setMargin(5);
int w = parent->geometry().width();
int h = parent->geometry().height();
QSize min(w/3-2*layout->spacing(),h/3-2*layout->spacing());
QSize max(w,h);
for (int n = 0; n < 6; ++n)
{
    layout->setRowStretch(n,6);
    layout->setColumnStretch(n,6);
}

for (size_t n = 0, t = widgets.size(); n < t; ++n)
{
    QWidget *widget = widgets[n];
    widget->setMinimumSize(min);
    widget->setMaximumSize(max);
    widget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    layout->addWidget(widget);
}

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我有类似的经历。我使用这样的小部件来可视化动态更改的设备配置。

使用QVBoxLayout作为行和QWidget广告单元格(列)可以实现所需的行为。在我的例子中,我使用从QLabel派生的自定义小部件作为单元格。一切都在盒子里工作,没有几何调整。

伪代码:

// Inside widget's constructor (or createLayout function).
topLayout = new QVBoxLayout ();

aLayout = new QHBoxLayout ();
bLayout = new QHBoxLayout ();
cLayout = new QHBoxLayout ();

topLayout->addLayout (aLayout);
topLayout->addLayout (bLayout);
topLayout->addLayout (cLayout);

setLayout (topLayout);

...

// Add cell to corresponding row.
void add_cell (QWidget * cell)
{
    aLayout->addWidget (cell);
}

答案 1 :(得分:2)

首先,通过迭代布局并删除包含小部件的项目,从布局中删除小部件。在执行此操作时,您还会收集有关可用单元格的信息。然后使用正确的位置和跨度重新插入小部件。

答案 2 :(得分:1)

据我所知,没有办法自动完成。我建议你保留一个小部件列表并通过清除网格布局重新定位它们,并在每次小部件改变其可见性时再次填充它。我发现只有这样我才能解决类似的任务(重新排列网格中的小部件)而不通过继承QLayout创建自定义布局。