6

私はこれを広範囲に調査しましたが、まだ満足のいく解決策を見つけていません:

これらの条件のいずれかが満たされたときに、ウィジェットの下部へのスクロールをトリガーせずに QTextEdit ウィジェットの最後にテキストを追加するにはどうすればよいですか?

  • ユーザーがテキストを選択しました。
  • ユーザーが下から離れてスクロールしました。

(それ以外の場合はすべて、QTextEdit ウィジェットの一番下までスクロールする必要があります。)

textQTextEdit の下部に追加するために現在使用しているコードは次のとおりwidgetです。

const QTextCursor old_cursor = widget.textCursor();

widget.moveCursor(QTextCursor::End);
widget.textCursor().insertText(text);

if (old_cursor.hasSelection())
    widget.setTextCursor(old_cursor);
else widget.moveCursor(QTextCursor::End);

これにより、条件 1 が部分的に処理されます。問題は、選択範囲の最後の行のみが表示されるまでビューがスクロールし続け、その時点で実際にスクロールが停止することです。

条件 2 はまったく考慮されていません。一部の投稿では、垂直スクロールバーの位置を保存し、テキストが追加された後に復元することを提案していますが、テキストが追加されたときにスクロールバーが上に移動する必要があるため、これは正しくないと思います。景色は静止しているのに。

ユーザーがテキストを選択したかどうかに関係なく、追加されるテキストの色を調整する必要があるため、QTextCursor::insertText()代わりに使用していることに注意してください。QTextEdit::append()


更新:Pavelの答えのおかげで、私が最終的に得たコードは次のとおりです:

const QTextCursor old_cursor = widget.textCursor();
const int old_scrollbar_value = widget.verticalScrollBar()->value();
const bool is_scrolled_down = old_scrollbar_value == widget.verticalScrollBar()->maximum();

// Move the cursor to the end of the document.
widget.moveCursor(QTextCursor::End);

// Insert the text at the position of the cursor (which is the end of the document).
widget.textCursor().insertText(text);

if (old_cursor.hasSelection() || !is_scrolled_down)
{
    // The user has selected text or scrolled away from the bottom: maintain position.
    widget.setTextCursor(old_cursor);
    widget.verticalScrollBar()->setValue(old_scrollbar_value);
}
else
{
    // The user hasn't selected any text and the scrollbar is at the bottom: scroll to the bottom.
    widget.moveCursor(QTextCursor::End);
    widget.verticalScrollBar()->setValue(verticalScrollBar()->maximum());
}
4

1 に答える 1