这不是我第一次想要一个行为如下的滚动区域(想象一个日志或聊天窗口,但太复杂而无法使用简单的 QTextBrowser):
- 我想添加多个小部件,它们出现在另一个下方(例如放置在 QVBoxLayout 中时)
- 此布局中的每个小部件都应具有固定大小或宽度换高(如简单标签)
- 滚动区域应自动滚动到最近添加的区域
- (可选)当有剩余空间时(滚动条尚未启用),内容应底部对齐
使用 QScrollArea:
我过去的尝试是在内部使用 QScrollArea 和 QVBoxLayout。但这似乎并没有我想的那么简单:每当我在布局中添加一个小部件时,布局并不会立即调整滚动区域内容小部件的大小,从而导致内容调整延迟。在短时间内,布局中包含的小部件会调整大小,以使总大小等于添加操作之前的总大小,从而导致每个小部件的大小过小。此外,在布局将其大小更正为小部件的新总大小之前,滚动到新添加的小部件是不可能的,因此即使是 QTimer::singleShot(0, ...) 也无济于事。即使超时时间为 20 左右,在某些情况下布局需要更多时间来调整大小。它不是确定性的,因此远离一个好的解决方案。
为了获得底部对齐行为,我最初在布局中放置了一个间隔项。只要没有剩余空间并启用滚动,它就不需要任何空间。
使用 QListView:
由于我的项目太复杂,它们需要是 QWidgets。他们无法获得焦点,无法选择,因此基于项目的解决方案似乎只是“错误的方式”。此外,这个解决方案听起来太“沉重”了。
我简直不敢相信没有简单的方法,所以我想我还没有看到它!