问:如何动态重新创建QGridLayout

时间:2014-05-15 16:41:13

标签: qt4 grid-layout

QGridLayout* layout = new QGridLayout;
int currentRow = 0;
int cb1row = currentRow;
QCheckBox cb1 = new QCheckBox("cb1");
layout->addWidget(cb1, currentRow++, 0, 1, -1, Qt::AlignTop);
QCheckBox cb2 = new QCheckBox("cb2");
layout->addWidget(cb2, currentRow++, 0, 1, -1, Qt::AlignTop);

如何在以后动态插入其他小部件?假设我想在cb1之后插入另一个复选框。我试过下面,但新的复选框和cb2都重叠了。有什么方法可以在插入时自动将其余小部件向下推一行吗?

int newCbRow = cb1row + 1;
QCheckBox newCb = new QCheckBox("cb3");
layout->addWidget(newCb , newCbRow, 0, 1, -1, Qt::AlignTop);

或者我应该使用另一种能够通过索引/行#来附加/插入小部件的布局?

2 个答案:

答案 0 :(得分:2)

你有几个解决方案,我想到了这些:

  • 如果问题显示的情况很简单,那么只需使用cb2QGridLayout移除QLayout::removeWidget(),然后重新添加到新位置。
  • 不是直接使用QGridLayout行,而是将每一行设为嵌套QHBoxLayout(主要布局可以是QGridLayout只有1列,或QVBoxLayout)。它支持插入中间。
  • 如果您想使用QGridLayout,并且实际用例比问题中显示的更复杂,那么只需在需要插入小部件时从头开始重新创建布局。编写一个方法,删除当前布局(如果存在,即不是第一次调用),然后创建一个新布局并将所有小部件放入其中。然后从构造函数中调用它,并在添加小部件时调用它,而不重复代码。

答案 1 :(得分:1)

如果您的小部件不跨越多个单元格,则可以将单元格中的所有小部件移动到单元格下方,这些小部件将添加到一行中。然后你有一行免费,你可以添加一个小部件。就个人而言,我倾向于使用嵌套布局QHBoxLayoutQVBoxLayout,因为它们在许多情况下提供更多自由。