我在QScrollArea中动态添加和删除小部件,我想在滚动条出现之前同时显示最多四个小部件。所以基本上,如果我有0-3个小部件并且我添加另一个小部件,则调整滚动区域以适应新的高度,之后,高度保持在4个小部件大小,你必须滚动才能看到第5个,第6个, ...
目前,我在插入/删除小部件时调用以下方法。
void WidgetList::resizeScrollArea()
{
// height of the first four widgets
int widgetsHeight = 0;
for (int i = 0; i < _widgets.size() && i < 4; ++i)
{
// height of a widget
widgetsHeight += _widgets.at(i)->sizeHint().height();
}
// some leeway to make sure we have some gap between the widgets
_ui->scrollArea->setFixedHeight(widgetsHeight + 5);
}
问题是sizeHint()并不总是正确的高度(有时太大),但size()(通常都太小)都不是。所以我的滚动区域对于内容来说往往有点太大了,但有时它会起作用
并非所有我的小部件都具有相同的高度,有时sizeHint似乎是正确的,有时它的大小。
我理解sizeHint是小部件想要的大小,而不是布局给它的大小,但我不知道大小不正确的原因。
对我应该如何做的任何想法都将非常感激。
答案 0 :(得分:0)
不应设置固定高度,而应覆盖sizeHint()
以返回窗口小部件的大小(如果需要,布局可以给它一些额外的,或者更少一些)。每当更改前4个子窗口小部件中的任何一个时,您将需要调用invalidate()
,以告知包含的布局,应重新计算任何以前的缓存值。
如果你的小部件都在QVBoxLayout
(我猜,但似乎有理由假设),那么你应该在计算中检索它的间距和上边距。