QTextEdit:仅当滚动条位于底部时自动向下滚动

Dan*_*iel 4 user-interface qt scrollbar qtextedit

有一个 QTextEdit 显示相当多的文本。它不可编辑。假设我想在开头阅读一些内容,向上滚动,但随后添加了一个新行,并且滚动条自动转到底部。我在使用各种程序时遇到类似的问题(无论它们是用什么语言编写的)。如何处理这个问题?

当向文本添加新行时我想要的行为:

  • 如果滚动条在底部,则自动向下滚动。
  • 如果滚动条在其他地方,则不要滚动

我认为 EnsureCursorVisible() 不是解决方案,因为 QTextEdit 不可编辑,用户不会在其中单击,并且光标的位置与垂直滚动条的位置不同。

小智 5

无需连接滚动条侦听器。只需在附加文本之前查询滚动条:

QScrollBar *scrollbar = textedit->verticalScrollBar();
bool scrollbarAtBottom  = (scrollbar->value() >= (scrollbar->maximum() - 4));
int scrollbarPrevValue = scrollbar->value();
Run Code Online (Sandbox Code Playgroud)

“-4”破解scrollbarAtBottom是必要的,因为ensureCursorVisible()它不会精确地滚动到底部,而是滚动到上面的一些固定量。检查一下你的字体大小。

现在您可以插入文本:

textedit->moveCursor(QTextCursor::End);
// begin with newline if text is not empty
if (! textedit->document()->isEmpty())
    textedit->insertHtml(QStringLiteral("<br>"));
textedit->insertHtml(QStringLiteral("My text here."))
Run Code Online (Sandbox Code Playgroud)

执行该操作后,要么滚动到底部,要么修复滚动条,使其根本不移动:

if (scrollbarAtBottom)
    textedit->ensureCursorVisible();
else
    textedit->verticalScrollBar()->setValue(scrollbarPrevValue);
Run Code Online (Sandbox Code Playgroud)