首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTextEdit:只有当滚动条位于底部时才自动向下滚动

QTextEdit:只有当滚动条位于底部时才自动向下滚动
EN

Stack Overflow用户
提问于 2013-01-27 17:39:50
回答 2查看 10.3K关注 0票数 3

有一个QTextEdit显示了相当多的文本。是不可编辑的。假设我想在开始的时候读一些东西,向上滚动,然后添加一个新的行,滚动条自动到达底部。我在使用各种程序时遇到了类似的问题(不管它们是用什么语言编写的)。如何处理这个问题?

在文本中添加新行时所需的行为:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-27 18:39:52

我会做滚动条位置监听器,它将记住滚动中的位置(并检查它是否位于底部)。

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

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

更具体的说,我会将插槽与来自QScrollBar - valueChanged(int值)的信号连接起来,并按这里描述的那样播放值。

票数 3
EN

Stack Overflow用户

发布于 2019-09-17 13:16:09

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

代码语言:javascript
复制
QScrollBar *scrollbar = textedit->verticalScrollBar();
bool scrollbarAtBottom  = (scrollbar->value() >= (scrollbar->maximum() - 4));
int scrollbarPrevValue = scrollbar->value();

scrollbarAtBottom中的“负4”攻击是必要的,因为ensureCursorVisible()并不是完全滚动到底部,而是在上面的一些固定数量。用你的字体大小检查它。

现在您可以插入文本:

代码语言:javascript
复制
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."))

在该操作之后,要么滚动到底部,要么修复滚动条,使其根本不移动:

代码语言:javascript
复制
if (scrollbarAtBottom)
    textedit->ensureCursorVisible();
else
    textedit->verticalScrollBar()->setValue(scrollbarPrevValue);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14550146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档