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

我在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)

2 years ago

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

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