Fix multiple QQuickTextEdit::textChanged emission

Signal disconnection previously failed due to mixing string
based connection with function pointer based one causing
QQuickTextEdit::textChanged to be emitted multiple times

Fixes: QTBUG-130676
Pick-to: 6.8
Change-Id: I3f948aa4b37a9b3a9ddd6240e248fd96fee36175
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
Hatem ElKharashy 2024-11-01 09:45:19 +02:00
parent fdc2a052aa
commit b3e70d1c20
2 changed files with 14 additions and 4 deletions

View File

@ -268,7 +268,7 @@ void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &
const int oldCursorPos = cursor.position();
// avoid multiple textChanged() signals being emitted
qmlobject_disconnect(doc, QTextDocument, SIGNAL(contentsChanged()), q, QQuickTextControl, SIGNAL(textChanged()));
QObject::disconnect(doc, &QTextDocument::contentsChanged, q, &QQuickTextControl::textChanged);
if (!text.isEmpty()) {
// clear 'our' cursor for insertion to prevent
@ -308,7 +308,7 @@ void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &
}
cursor.setCharFormat(charFormatForInsertion);
qmlobject_connect(doc, QTextDocument, SIGNAL(contentsChanged()), q, QQuickTextControl, SIGNAL(textChanged()));
QObject::connect(doc, &QTextDocument::contentsChanged, q, &QQuickTextControl::textChanged);
emit q->textChanged();
doc->setUndoRedoEnabled(previousUndoRedoState);
_q_updateCurrentCharFormatAndSelection();
@ -615,10 +615,10 @@ void QQuickTextControl::setDocument(QTextDocument *doc)
QAbstractTextDocumentLayout *layout = doc->documentLayout();
connect(layout, &QAbstractTextDocumentLayout::update, this, &QQuickTextControl::updateRequest);
connect(layout, &QAbstractTextDocumentLayout::updateBlock, this, &QQuickTextControl::updateRequest);
connect(doc, &QTextDocument::contentsChanged, this, [d, this]() {
connect(doc, &QTextDocument::contentsChanged, this, [d]() {
d->_q_updateCurrentCharFormatAndSelection();
emit textChanged();
});
connect(doc, &QTextDocument::contentsChanged, this, &QQuickTextControl::textChanged);
connect(doc, &QTextDocument::cursorPositionChanged, this, [d](const QTextCursor &cursor) {
d->_q_updateCursorPosChanged(cursor);
});

View File

@ -206,6 +206,7 @@ private slots:
void cursorRectangle_QTBUG_38947();
void textCached_QTBUG_41583();
void doubleSelect_QTBUG_38704();
void textChanged_QTBUG_130676();
void padding();
void paddingAndWrap();
@ -6217,6 +6218,15 @@ void tst_qquicktextedit::doubleSelect_QTBUG_38704()
QCOMPARE(selectionSpy.size(), 3);
}
void tst_qquicktextedit::textChanged_QTBUG_130676()
{
QQuickTextEdit textEdit;
QSignalSpy spy(&textEdit, SIGNAL(textChanged()));
QVERIFY(spy.isValid());
textEdit.setText("Hello Qt");
QVERIFY(spy.count() == 1);
}
void tst_qquicktextedit::padding()
{
QScopedPointer<QQuickView> window(new QQuickView);