2

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

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

  • 如果滚动条位于底部,则自动向下滚动。
  • 如果滚动条在别处,不要滚动

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

4

2 回答 2

3

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

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

检查此QScrollBar,您可以通过 Horizo​​ntalScrollBar() 和 verticalScrollBar() 从 QTextEdit 中获取它。


更具体地说,我会将 slot 与来自 QScrollBar - valueChanged(int value)的信号连接起来,并使用此处描述的值。

于 2013-01-27T18:39:52.687 回答
2

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

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

“减 4” hackscrollbarAtBottom是必要的,因为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);
于 2019-09-17T13:16:09.310 回答