Fix insert and scroll to bottom case

When using QtextCursor::insert() with a large text followed by setting
the vertical scrollbar to its maximum value (scroll to bottom),
QPlainTextEdit would not behave properly if a document size
change was triggered by the insertion due to line wrapping.

This was visible in Qt Creator.

Auto test included.

Reviewed-by: con
(cherry picked from commit 5d144faf3c524ab557b88f69c4b755e20237e846)
This commit is contained in:
mae 2011-04-26 15:41:21 +02:00 committed by Olivier Goffart
parent d4eedda7d2
commit 4d38a48a70
2 changed files with 23 additions and 0 deletions

View File

@ -648,6 +648,11 @@ void QPlainTextEditPrivate::setTopBlock(int blockNumber, int lineNumber, int dx)
}
control->topBlock = blockNumber;
topLine = lineNumber;
bool vbarSignalsBlocked = vbar->blockSignals(true);
vbar->setValue(block.firstLineNumber() + lineNumber);
vbar->blockSignals(vbarSignalsBlocked);
if (dx || dy)
viewport->scroll(q->isRightToLeft() ? -dx : dx, dy);
else

View File

@ -150,6 +150,7 @@ private slots:
void lineWrapProperty();
void selectionChanged();
void blockCountChanged();
void insertAndScrollToBottom();
private:
void createSelection();
@ -1504,5 +1505,22 @@ void tst_QPlainTextEdit::blockCountChanged()
}
void tst_QPlainTextEdit::insertAndScrollToBottom()
{
ed->setPlainText("First Line");
ed->show();
QString text;
for(int i = 0; i < 2000; ++i) {
text += QLatin1String("this is another line of text to be appended. It is quite long and will probably wrap around, meaning the number of lines is larger than the number of blocks in the text.\n");
}
QTextCursor cursor = ed->textCursor();
cursor.beginEditBlock();
cursor.insertText(text);
cursor.endEditBlock();
ed->verticalScrollBar()->setValue(ed->verticalScrollBar()->maximum());
QCOMPARE(ed->verticalScrollBar()->value(), ed->verticalScrollBar()->maximum());
}
QTEST_MAIN(tst_QPlainTextEdit)
#include "tst_qplaintextedit.moc"