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

时间:2013-01-27 17:39:51

标签: qt user-interface scrollbar qtextedit

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

选中此QScrollBar,您可以通过horizo​​ntalScrollBar()和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);