QScrollArea vertical sizePolicy - 将内容调整到最大高度

QScrollArea vertical sizePolicy - Fit contents up to maximum height

我遇到了一个真正的挑战,让 QScrollArea 将最小 space 可能达到最大高度。

我的 GUI 模型如下:QScrollArea 包含一个垂直布局,其中填充了 class TableRow 的小部件。我希望这个 class TableRow 尽可能占据最小高度。它的顶部有一个始终可见的小部件,下面有一个 QScrollArea,其中有一个标签,其可见性可以切换。该标签适用于可能为 0 个字符或长度可能无限长的注释(除了硬件限制)。

我发现对于 class TableRow 中的标签,将垂直 sizePolicy 设置为 Fixed 实际上会占用它需要多少空间来适应所有内容(参见:Qt Layout, resize to minimum after widget size changes)。然而,这似乎不适用于 QScrollArea。事实上,我尝试过的每个 sizePolicy 都将 QScrollArea 保持在固定高度; Ignore 除外,但随后 QScrollArea 的高度变为 0,无论其内容如何。

我创建了一个 git branch 生成此问题的简化版本。

这是应用固定垂直 sizePolicy 的结果:

我对这个测试用例的期望:

我知道我可能需要覆盖一些东西才能使这项工作正常进行,因为就其本身而言,QScrollArea 的高度可能取决于其子部件的原因并不明显(这可能就是为什么它的设计目的不是为了使这变得容易,或者至少看起来不是)。

但是,我认为我试图提出的案例很常见,我目前的做法是合理的。如果有 another/better 方法可以使单个小部件在达到最大高度后滚动,我愿意将其作为答案,前提是它满足我期望的三个条件。

这感觉更像是一种 hack 而不是解决方案,但它确实对我有用,至少在短期内是这样。因为 lblNotes 的文本不会改变运行时,我能够在我的 TableRow 小部件的构造函数中添加以下代码:

// Hack to resize QScrollAreas
ui->lblNotes->adjustSize(); // Otherwise lblNotes will think its height is still ~0px
int height = ui->lblNotes->height() + 12; // Borders and margins add up to 12px
if (height > 100) { height = 100; } // Cap the height at desired maximum value
ui->scrollArea->setFixedHeight(height);

如果我必须处理动态设置文本的情况,我可以将其包装在一个函数中,以便在设置 lblNotes 的文本时随时调用。

我仍然对涉及使用 Qt 原生布局功能的解决方案持开放态度,因为我相信如果存在解决方案,那将是首选。一些QScrollArea内容可能无法直接确定未来的高度。