diff options
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 29 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 51 |
4 files changed, 82 insertions, 0 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 6d4be60131..1cc5d4d75d 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -118,6 +118,8 @@ void QQuickTextInput::componentComplete() \qmlproperty string QtQuick::TextInput::text The text in the TextInput. + + \sa clear() */ QString QQuickTextInput::text() const { @@ -1932,6 +1934,7 @@ void QQuickTextInput::undo() { Q_D(QQuickTextInput); if (!d->m_readOnly) { + d->resetInputMethod(); d->internalUndo(); d->finishChange(-1, true); } @@ -1947,6 +1950,7 @@ void QQuickTextInput::redo() { Q_D(QQuickTextInput); if (!d->m_readOnly) { + d->resetInputMethod(); d->internalRedo(); d->finishChange(); } @@ -2569,6 +2573,13 @@ void QQuickTextInputPrivate::init() } } +void QQuickTextInputPrivate::resetInputMethod() +{ + Q_Q(QQuickTextInput); + if (!m_readOnly && q->hasActiveFocus() && qGuiApp) + QGuiApplication::inputMethod()->reset(); +} + void QQuickTextInput::updateCursorRectangle(bool scroll) { Q_D(QQuickTextInput); @@ -4474,6 +4485,24 @@ void QQuickTextInput::ensureVisible(int position) } /*! + \qmlmethod QtQuick::TextInput::clear() + \since 5.7 + + Clears the contents of the text input + and resets partial text input from an input method. + + Use this method instead of setting the \l text property to an empty string. + + \sa QInputMethod::reset() +*/ +void QQuickTextInput::clear() +{ + Q_D(QQuickTextInput); + d->resetInputMethod(); + d->clear(); +} + +/*! \since 5.6 \qmlproperty real QtQuick::TextInput::padding \qmlproperty real QtQuick::TextInput::topPadding diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index 2dcc67a856..365d9685ce 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -388,6 +388,7 @@ public Q_SLOTS: void insert(int position, const QString &text); void remove(int start, int end); Q_REVISION(3) void ensureVisible(int position); + Q_REVISION(7) void clear(); private Q_SLOTS: void selectionChanged(); diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 6aaa630839..4222ad5f76 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -160,6 +160,7 @@ public: } void init(); + void resetInputMethod(); void startCreatingCursor(); void ensureVisible(int position, int preeditCursor = 0, int preeditLength = 0); void updateHorizontalScroll(); diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index 1e5b7b3848..ecaf0975a9 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -192,6 +192,7 @@ private slots: void redo(); void undo_keypressevents_data(); void undo_keypressevents(); + void clear(); void backspaceSurrogatePairs(); @@ -5724,6 +5725,56 @@ void tst_qquicktextinput::undo_keypressevents() QVERIFY(textInput->text().isEmpty()); } +void tst_qquicktextinput::clear() +{ + QString componentStr = "import QtQuick 2.0\nTextInput { focus: true }"; + QQmlComponent textInputComponent(&engine); + textInputComponent.setData(componentStr.toLatin1(), QUrl()); + QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(textInputComponent.create()); + QVERIFY(textInput != 0); + + QQuickWindow window; + textInput->setParentItem(window.contentItem()); + window.show(); + window.requestActivate(); + QTest::qWaitForWindowActive(&window); + QVERIFY(textInput->hasActiveFocus()); + QVERIFY(!textInput->canUndo()); + + QSignalSpy spy(textInput, SIGNAL(canUndoChanged())); + + textInput->setText("I am Legend"); + QCOMPARE(textInput->text(), QString("I am Legend")); + textInput->clear(); + QVERIFY(textInput->text().isEmpty()); + + QCOMPARE(spy.count(), 1); + + // checks that clears can be undone + textInput->undo(); + QVERIFY(!textInput->canUndo()); + QCOMPARE(spy.count(), 2); + QCOMPARE(textInput->text(), QString("I am Legend")); + + textInput->setCursorPosition(4); + QInputMethodEvent preeditEvent("PREEDIT", QList<QInputMethodEvent::Attribute>()); + QGuiApplication::sendEvent(textInput, &preeditEvent); + QCOMPARE(textInput->text(), QString("I am Legend")); + QCOMPARE(textInput->displayText(), QString("I amPREEDIT Legend")); + QCOMPARE(textInput->preeditText(), QString("PREEDIT")); + + textInput->clear(); + QVERIFY(textInput->text().isEmpty()); + + QCOMPARE(spy.count(), 3); + + // checks that clears can be undone + textInput->undo(); + QVERIFY(!textInput->canUndo()); + QCOMPARE(spy.count(), 4); + QCOMPARE(textInput->text(), QString("I am Legend")); +} + void tst_qquicktextinput::backspaceSurrogatePairs() { // Test backspace, and delete remove both characters in a surrogate pair. |