gpt4 book ai didi

c++ - QScrollArea vertical sizePolicy - 将内容调整到最大高度

转载 作者:太空狗 更新时间:2023-10-29 23:15:12 28 4
gpt4 key购买 nike

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

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

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

我知道我可能需要覆盖一些东西才能使这项工作正常进行,因为就其本身而言,QScrollArea 的高度可能取决于其子部件的原因并不明显(这可能就是为什么它的设计目的不是为了使这变得容易,或者在至少看起来不是)。

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

最佳答案

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

关于c++ - QScrollArea vertical sizePolicy - 将内容调整到最大高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280230/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com