我遇到了一个真正的挑战,让QScrollArea
尽可能地占用最小空间。
我的GUI模型如下:QScrollArea
包含一个垂直布局,其中填充了类TableRow
的窗口小部件。我希望这个班级TableRow
占用最小高度。它在顶部有一个始终可见的小部件,下面有一个QScrollArea
,其中有一个标签,可以切换其可见性。标签用于注释,可以是0个字符,也可以是无限长(除了硬件限制)。
我发现,对于班级TableRow
中的标签,将垂直sizePolicy
设置为Fixed
实际上会占用所需内容的所需内容(请参阅:{ {3}})。但是,这似乎不适用于QScrollArea
。事实上,我尝试过的每个sizePolicy
都会将QScrollArea
保持在固定的高度;除了Ignore
,但QScrollArea
的高度为0,无论其内容如何。
我创建了Qt Layout, resize to minimum after widget size changes,生成了此问题的简化版本。
以下是应用固定垂直sizePolicy的结果:
我对此测试案例的期望是什么:
QLabel
和QScrollArea
QScrollArea
的最大高度为100px)但大到足以显示标签而不滚动sizePolicy
设置为Ignored
时我知道我可能需要覆盖一些事情来使这项工作,因为它本身并不明显为什么QScrollArea的高度可能依赖于它的子窗口小部件(这可能是为什么它不是为了简化它,或者为至少它似乎不是)。
但是,我认为我试图制作的案例很常见,而且我目前的做法是合理的。如果有另一种/更好的方法可以使单个小部件在达到最大高度后滚动,那么我可以将其作为答案,只要它符合我期望的三个条件。
答案 0 :(得分:0)
这更像是一个黑客而不是一个解决方案,但它确实对我有用,至少在短期内如此。因为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
内容可能不会直接确定将来的高度。