经常要寻求的行为是,如果用户没有在其他地方滚动,则将“ log”输出窗口小部件滚动到底部。那里有特定于小部件的解决方案,即特定于QTextEdit
或QListView
等,但是它们始终需要更改用户代码-并且用户代码已经做正确的事并将数据附加到视图使用的模型。更改该代码可能会将其不适当地与视图的细节联系在一起,从而产生不良的软件设计气味。
因此,人们可能希望的是一种无需更改用户代码即可修改小部件本身行为的方法。此外-也许有一种方法可以在大多数从QAbstractScrollArea
派生的类中使用?
答案 0 :(得分:2)
一个可行的解决方案仅需要访问视图的滚动条,并且可以轻松地调整为与使用滚动条的任何小部件一起使用-不仅QAbstractScrollArea
,即使Qt提供的所有垂直滚动小部件确实可以派生。从该小部件中获取(应该如此)。
允许使用这种低级方法的主要观察结果是,每当将内容附加到窗口小部件时,垂直滚动条的 range 都会改变。因此:
只要滚动条的 range
发生变化,我们就会滚动到底部,如果我们处于viewAtBottom
状态。
只要滚动条的 value
发生变化,我们都会更新viewAtBottom
以反映滚动条是否在其范围的末端(最大)。 / p>
这允许用户在内容中自由滚动而不会受到干扰,但是如果滚动条放置在范围的末尾,它将“粘在”该范围的末端。
当然,有人希望有一种方法可以使QScrollBar
受到这种行为的影响,但是至少从Qt 5.11开始,没有任何标志可以启用它。
以下功能在QAbstractScrollArea
(即QListView
或QListWidget
,QTextEdit
,QTextBrowser
,{ {1}}等),当添加内容并且滚动条的范围扩大时,它会停留在底部的行为。
以下内容在Qt 5中有效,并且可以通过将lambda作为助手类中的插槽重新实现而轻松地适应Qt 4。直接使用滚动条的功能也可以排除。
QPlainTextEdit
有关此代码的完整示例,请参见this answer。