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



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

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

  • 如果滚动条位于底部,请自动向下滚动。
  • 如果滚动条位于其他位置,请不要滚动

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

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

QScrollBar *scrollbar = textedit->verticalScrollBar();
bool scrollbarAtBottom  = (scrollbar->value() >= (scrollbar->maximum() - 4));
int scrollbarPrevValue = scrollbar->value();

scrollbarAtBottom中的"减 4"黑客是必要的,因为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."))

完成该操作后,滚动到底部,或修复滚动条,使其根本不移动:

if (scrollbarAtBottom)
    textedit->ensureCursorVisible();
else
    textedit->verticalScrollBar()->setValue(scrollbarPrevValue);

我会让滚动条位置侦听器,它会记住滚动时的位置(并检查它是否在底部)。

然后,当添加新行时,检查它是否在底部,如果是向下滚动,如果是其他地方,则滚动回该位置。

检查这个QScrollBar,你可以通过horizontalScrollBar()和verticalScrollBar()从QTextEdit抓取它。


更具体地说,我会将插槽与来自 QScrollBar 的信号连接起来 - valueChanged(int value) 并按照此处描述的值进行游戏。

相关内容

  • 没有找到相关文章

最新更新