Qt:调整QScrollArea的大小以显示最多4个小部件

时间:2016-07-11 14:12:38

标签: c++ qt user-interface

我在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是小部件想要的大小,而不是布局给它的大小,但我不知道大小不正确的原因。

对我应该如何做的任何想法都将非常感激。

1 个答案:

答案 0 :(得分:0)

不应设置固定高度,而应覆盖sizeHint()以返回窗口小部件的大小(如果需要,布局可以给它一些额外的,或者更少一些)。每当更改前4个子窗口小部件中的任何一个时,您将需要调用invalidate(),以告知包含的布局,应重新计算任何以前的缓存值。

如果你的小部件都在QVBoxLayout(我猜,但似乎有理由假设),那么你应该在计算中检索它的间距和上边距。