【问题标题】:QTextEdit: scroll down automatically only if the scrollbar is at the bottomQTextEdit:仅当滚动条位于底部时才会自动向下滚动
【发布时间】:2013-01-11 02:09:12
【问题描述】:

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

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

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

我认为 确保光标可见() 不是解决办法,因为QTextEdit是不可编辑的,用户不会在里面点击,而且光标的位置和垂直滚动条的位置不一样。

【问题讨论】:

    标签: qt user-interface scrollbar qtextedit


    【解决方案1】:

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

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

    scrollbarAtBottom 中的“减 4” hack 是必要的,因为 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);
    

    【讨论】:

      【解决方案2】:

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

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

      检查这个QScrollBar,你可以通过horizo​​ntalScrollBar()和verticalScrollBar()从QTextEdit中获取它。


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

      【讨论】:

        猜你喜欢
        • 2014-11-03
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多