有一个QTextEdit显示了很多文字。它不可编辑。假设我想在开头读取一些内容,向上滚动,但随后会添加一个新行,滚动条会自动转到底部。我在使用各种程序时遇到类似的问题(无论用什么语言编写)。如何处理这个问题?
将新行添加到文本时我想要的行为:
我想是的 ensureCursorVisible() 不是解决方案,因为QTextEdit不可编辑,用户不会在其中单击,并且光标的位置与垂直滚动条的位置不同。
答案 0 :(得分:2)
我会制作滚动条位置监听器,它会记住滚动时的位置(并检查它是否在底部)。
然后,当添加新行时,检查它是否在底部,如果向下滚动,如果在其他地方,则滚动回到该位置。
选中此QScrollBar,您可以通过horizontalScrollBar()和verticalScrollBar()从QTextEdit中获取它。
更具体的是,我会使用来自QScrollBar的信号连接插槽 - valueChanged(int value)并使用here所述的值进行播放。
答案 1 :(得分:0)
不必连接滚动条侦听器。只需在添加文本之前查询滚动条即可:
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);