Blob Blame History Raw
From 34c297faca93e1286573b2a01127e4e7af00aff2 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <>
Date: Mon, 24 Jan 2011 19:09:38 +0100
Subject: [PATCH] Fix cursor position adjustment when removing strings

Commit 0ba1b4d0 introduced a regression to QTextDocument: it postponed
cursor position adjustment until the move operation is done, but
contentsChanged will be triggered by finishEdit() in this move
operation, thus cursor positions in this signal handler will be in
inconsistent states (normally we should first update cursor position
then trigger contentsChanged). In this case we should also postpone
finishEdit() handling after cursor positions have been adjusted, then
the states expose to applications will be consistent.

Task-number: QTBUG-15857
Reviewed-by: Eskil
 src/gui/text/qtextdocument_p.cpp           |    4 +++-
 tests/auto/qtextcursor/tst_qtextcursor.cpp |   28 ++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp
index 498a432..2172f74 100644
--- a/src/gui/text/qtextdocument_p.cpp
+++ b/src/gui/text/qtextdocument_p.cpp
@@ -663,7 +663,8 @@ void QTextDocumentPrivate::move(int pos, int to, int length, QTextUndoCommand::O
     Q_ASSERT(blocks.length() == fragments.length());
-    finishEdit();
+    if (!blockCursorAdjustment)
+        finishEdit();
 void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operation op)
@@ -678,6 +679,7 @@ void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operati
             curs->changed = true;
+    finishEdit();
 void QTextDocumentPrivate::setCharFormat(int pos, int length, const QTextCharFormat &newFormat, FormatChangeMode mode)