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

Qt: Resize QScrollArea to show 4 widgets at most

本文关键字:显示 4个 小部 调整 QScrollArea Qt      更新时间:2023-10-16

我正在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 是小部件想要的大小,而不是布局给它的大小,但我不明白为什么大小不正确。

关于我应该如何做的任何想法将不胜感激。

您应该覆盖sizeHint()以返回小部件想要的大小,而不是设置固定高度(以便布局可以在需要时为其提供一些额外的或更少的空间)。 每当前 4 个子小部件中的任何一个发生更改时,您都需要调用 invalidate(),以告知包含布局应重新计算任何以前的缓存值。

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