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(上部小部件的高度),仅显示QLabel
和 QScrollArea
的边框
第二个小部件的高度应小于 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 - 将内容调整到最大高度的主要内容,如果未能解决你的问题,请参考以下文章