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

Posted

技术标签:

【中文标题】QScrollArea 垂直 sizePolicy - 将内容调整到最大高度【英文标题】:QScrollArea vertical sizePolicy - Fit contents up to maximum height 【发布时间】:2015-05-16 20:06:58 【问题描述】:

QScrollArea 将尽可能小的空间占用到最大高度,我遇到了真正的挑战。

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

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

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

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

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

第一个小部件的高度应接近 30px(上部小部件的高度),仅显示 QLabelQScrollArea 的边框 第二个小部件的高度应小于 130 像素(QScrollArea 的最大高度为 100 像素)但大到足以显示标签而无需滚动 第三个小部件的高度应该是 130 像素,并且应该出现滚动条(这部分在我尝试过的所有情况下都是正确的,除了垂直 sizePolicy 设置为 Ignored 时)

我知道我可能需要重写一些东西才能使它工作,因为它本身并不明显为什么 QScrollArea 的高度可能依赖于它的子小部件(这可能是为什么它不是为了让这件事变得简单而设计的,或者在至少看起来不是)。

但是,我认为我试图提出的案例已经足够普遍,而且我目前的做法是合理的。如果有另一种/更好的方法可以使单个小部件在达到最大高度后滚动,我愿意作为答案,只要它满足我期望的三个条件。

【问题讨论】:

您是否尝试过在视口而不是滚动区域本身上设置大小策略? 可能不会。什么是视口? :) Google:视口是 QScrollArea 内的小部件,所有子小部件都在其中呈现?我也试过调整这个,是的。目前我已将其设置为Fixed 如果视口是固定大小的,它不会动态调整你需要的方式。尝试使用布局的 sizeConstraint 属性和拉伸,也许? 您在视口/布局上有建议的 sizeHint/sizeConstraint/stretch 组合吗?我尝试的组合无济于事。我相信我需要视口为固定大小。正如我从我发布的 SO Link 中了解到的,fixed 实际上会假定所需的最小空间。从我能够测试的情况来看,这似乎也适用于视口。此外,用最大尺寸强制它更小对 ScrollArea 没有影响。虽然我可能会误解我在调试时看到的内容。 【参考方案1】:

这感觉更像是一个 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 内容可能无法直接确定未来的高度。

【讨论】:

以上是关于QScrollArea 垂直 sizePolicy - 将内容调整到最大高度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QScrollArea 使滚动条出现

使用 QScrollArea 和 QQuickWidget

如何使 QTextBrowser 具有最大的尺寸?

通过 textinput 添加新项目时,阻止 QScrollArea 项目跳来跳去

设置 QtreeWidget 高度

如何设置我的 mainWindow 的 sizePolicy?