4

我遇到了一个真正的挑战,就是QScrollArea将可能的最小空间提升到最大高度。

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

我发现,对于类中的标签,TableRow将垂直设置sizePolicyFixed实际上会占用它需要多少来适应所有内容(请参阅: Qt 布局,在小部件大小更改后调整为最小值)。但是,这似乎不适用于QScrollArea. 事实上,sizePolicy我尝试过的每一个都保持QScrollArea在一个固定的高度;除了Ignore,但QScrollArea不管它的内容如何,​​它的高度都为 0。

我创建了一个git 分支,生成了这个问题的简化版本。

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

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

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

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

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

4

1 回答 1

3

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

于 2015-05-19T16:43:31.063 回答