有一个QTextEdit显示了相当多的文本。是不可编辑的。假设我想在开始的时候读一些东西,向上滚动,然后添加一个新的行,滚动条自动到达底部。我在使用各种程序时遇到了类似的问题(不管它们是用什么语言编写的)。如何处理这个问题?
在文本中添加新行时所需的行为:
我认为ensureCursorVisible()不是解决方案,因为QTextEdit是不可编辑的,用户不会在其中单击,光标的位置与垂直滚动条的位置不一样。
发布于 2013-01-27 18:39:52
我会做滚动条位置监听器,它将记住滚动中的位置(并检查它是否位于底部)。
然后,当添加新行时,检查它是否位于底部,如果是向下滚动,如果是在其他地方,则回滚到该位置。
检查这个QScrollBar,您可以通过horizontalScrollBar()和verticalScrollBar()从QTextEdit获取它。
更具体的说,我会将插槽与来自QScrollBar - valueChanged(int值)的信号连接起来,并按这里描述的那样播放值。
发布于 2019-09-17 13:16:09
没有必要连接滚动条侦听器。只需在附加文本之前查询滚动条:
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);https://stackoverflow.com/questions/14550146
复制相似问题