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)