aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextinput.cpp29
-rw-r--r--src/quick/items/qquicktextinput_p.h1
-rw-r--r--src/quick/items/qquicktextinput_p_p.h1
-rw-r--r--tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp51
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.