【问题标题】:QGridLayout 3x3 grid resize widgetsQGridLayout 3x3 网格调整大小小部件
【发布时间】:2017-06-11 15:16:21
【问题描述】:

我有 9 个 QWidget。有时它们是看不见的。它们都在一个 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);
}

提前感谢您的帮助。

【问题讨论】:

  • 我尝试实现相同的行为。我已经通过使用QVBoxLayout 实现行和QLabel 实现单元格(行)成功地解决了这个问题。一切都可以直接使用,无需调整几何形状。
  • @Gluttton 很有趣,我考虑过使用 QVBoxLayout 和 QHBoxLayout 但我不确定。您有实施的示例吗?
  • 很遗憾我不能分享它。但这是微不足道的实现:something lile pastebin.com/th4mHWu0 .
  • @Gluttton 很有魅力,非常感谢!把它放在一个答案中,我会投赞成票。

标签: c++ qt qgridlayout


【解决方案1】:

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

可以通过使用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);
}

【讨论】:

  • 这将适用于问题中显示的情况。但是,fonZ 有一个额外的要求:垂直方向也应该如此。当例如 1 和 4 被隐藏时,您如何处理这种情况?据我了解,从问题中显示的内容来看,0 应该占据 1 的空间和 4 的一半,而 7 占据 4 的另一半。
  • @scopchanov,是的,你是对的,我的解决方案仅适用于“水平生成”。
  • 当然不会以任何方式使其无法使用。我只是好奇垂直增长是否可以以与我建议的方式不同的方式解决。老实说,我发现使用 QGridLayout 并没有想象中那么方便。
【解决方案2】:

首先,通过迭代布局并删除包含小部件的项目,从布局中删除小部件。在这样做的同时,您还收集有关可用单元格的信息。然后重新插入具有适当位置和跨度的小部件。

【讨论】:

    【解决方案3】:

    据我所知,没有办法自动做到这一点。我建议您保留小部件列表并通过清除网格布局并在每次小部件更改其可见性时再次填充它来重新定位它们。我发现只有这样我才能解决我的类似任务(用于重新排列网格中的小部件),而无需通过子类化 QLayout 创建自定义布局。

    【讨论】:

    • 不需要清除布局。布局支持删除单个小部件。
    • 是的,他们当然会。但是,我发现先清除布局然后重新填充它更容易。尤其是使用 QGridLayout,这应该是首选策略。
    • "这应该是首选策略" 我读到的方式是你更喜欢它,因为你发现它“更容易。这真的取决于手头的任务。
    • 完全同意。这是我个人的喜好。我发现这样更容易,即更具可读性。对于 9 个对象,在这种情况下,它不应该导致性能问题。对于大量对象,策略可能会有所不同。所以这确实取决于任务。顺便说一句,应该(建议性)和必须(强制性)之间是有区别的。无意冒犯,当然,只是澄清一下!
    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2012-12-22
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多