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);
或者我应该使用另一种能够通过索引/行#来附加/插入小部件的布局?
答案 0 :(得分:2)
你有几个解决方案,我想到了这些:
cb2
从QGridLayout
移除QLayout::removeWidget()
,然后重新添加到新位置。QGridLayout
行,而是将每一行设为嵌套QHBoxLayout
(主要布局可以是QGridLayout
只有1列,或QVBoxLayout
)。它支持插入中间。QGridLayout
,并且实际用例比问题中显示的更复杂,那么只需在需要插入小部件时从头开始重新创建布局。编写一个方法,删除当前布局(如果存在,即不是第一次调用),然后创建一个新布局并将所有小部件放入其中。然后从构造函数中调用它,并在添加小部件时调用它,而不重复代码。答案 1 :(得分:1)
如果您的小部件不跨越多个单元格,则可以将单元格中的所有小部件移动到单元格下方,这些小部件将添加到一行中。然后你有一行免费,你可以添加一个小部件。就个人而言,我倾向于使用嵌套布局QHBoxLayout
和QVBoxLayout
,因为它们在许多情况下提供更多自由。