QScrollArea vertical sizePolicy - 使内容适合最大高度

时间:2015-05-16 20:06:59

标签: c++ qt user-interface qlayout

我遇到了一个真正的挑战,让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的结果: Result of fixed vertical sizePolicy

我对此测试案例的期望是什么:

  • 第一个小部件的高度应该几乎为30px(上部小部件的高度),仅显示QLabelQScrollArea
  • 的边框
  • 第二个小部件的高度应小于130px(QScrollArea的最大高度为100px)但大到足以显示标签而不滚动
  • 第三个小部件的高度应该是130px,并且应该出现滚动条(除非垂直sizePolicy设置为Ignored

我知道我可能需要覆盖一些事情来使这项工作,因为它本身并不明显为什么QScrollArea的高度可能依赖于它的子窗口小部件(这可能是为什么它不是为了简化它,或者为至少它似乎不是)。

但是,我认为我试图制作的案例很常见,而且我目前的做法是合理的。如果有另一种/更好的方法可以使单个小部件在达到最大高度后滚动,那么我可以将其作为答案,只要它符合我期望的三个条件。

1 个答案:

答案 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内容可能不会直接确定将来的高度。