aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextcontrol.cpp7
-rw-r--r--src/quick/items/qquicktextcontrol_p.h1
-rw-r--r--src/quick/items/qquicktextedit.cpp27
-rw-r--r--src/quick/items/qquicktextedit_p.h1
-rw-r--r--src/quick/items/qquicktextedit_p_p.h1
-rw-r--r--tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp61
6 files changed, 98 insertions, 0 deletions
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp
index d3e858c67f..f87601dfe1 100644
--- a/src/quick/items/qquicktextcontrol.cpp
+++ b/src/quick/items/qquicktextcontrol.cpp
@@ -577,6 +577,13 @@ void QQuickTextControl::redo()
updateCursorRectangle(true);
}
+void QQuickTextControl::clear()
+{
+ Q_D(QQuickTextControl);
+ d->cursor.select(QTextCursor::Document);
+ d->cursor.removeSelectedText();
+}
+
QQuickTextControl::QQuickTextControl(QTextDocument *doc, QObject *parent)
: QObject(*new QQuickTextControlPrivate, parent)
{
diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h
index 146201eb70..06a1ee4f19 100644
--- a/src/quick/items/qquicktextcontrol_p.h
+++ b/src/quick/items/qquicktextcontrol_p.h
@@ -128,6 +128,7 @@ public Q_SLOTS:
void undo();
void redo();
+ void clear();
void selectAll();
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index 0535bc4e6b..75eab3f2fe 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -328,6 +328,8 @@ QString QQuickTextEdit::text() const
insert() and remove() methods provide more fine-grained control and
remarkably better performance for modifying especially large rich text
content.
+
+ \sa clear()
*/
void QQuickTextEdit::setText(const QString &text)
{
@@ -2197,6 +2199,13 @@ void QQuickTextEditPrivate::init()
q->updateSize();
}
+void QQuickTextEditPrivate::resetInputMethod()
+{
+ Q_Q(QQuickTextEdit);
+ if (!q->isReadOnly() && q->hasActiveFocus() && qGuiApp)
+ QGuiApplication::inputMethod()->reset();
+}
+
void QQuickTextEdit::q_textChanged()
{
Q_D(QQuickTextEdit);
@@ -2952,4 +2961,22 @@ void QQuickTextEdit::resetBottomPadding()
d->setBottomPadding(0, true);
}
+/*!
+ \qmlmethod QtQuick::TextEdit::clear()
+ \since 5.7
+
+ Clears the contents of the text edit
+ 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 QQuickTextEdit::clear()
+{
+ Q_D(QQuickTextEdit);
+ d->resetInputMethod();
+ d->control->clear();
+}
+
QT_END_NAMESPACE
diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h
index e222f497e3..0e12c68582 100644
--- a/src/quick/items/qquicktextedit_p.h
+++ b/src/quick/items/qquicktextedit_p.h
@@ -346,6 +346,7 @@ public Q_SLOTS:
void insert(int position, const QString &text);
void remove(int start, int end);
Q_REVISION(2) void append(const QString &text);
+ Q_REVISION(7) void clear();
private Q_SLOTS:
void q_textChanged();
diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h
index a2b4c1ab99..5059675541 100644
--- a/src/quick/items/qquicktextedit_p_p.h
+++ b/src/quick/items/qquicktextedit_p_p.h
@@ -135,6 +135,7 @@ public:
void init();
+ void resetInputMethod();
void updateDefaultTextOption();
void relayoutDocument();
bool determineHorizontalAlignment();
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index f71168412b..e8b84d4554 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -194,6 +194,7 @@ private slots:
void redo();
void undo_keypressevents_data();
void undo_keypressevents();
+ void clear();
void baseUrl();
void embeddedImages();
@@ -5247,6 +5248,66 @@ void tst_qquicktextedit::undo_keypressevents()
QVERIFY(textEdit->text().isEmpty());
}
+void tst_qquicktextedit::clear()
+{
+ QString componentStr = "import QtQuick 2.0\nTextEdit { focus: true }";
+ QQmlComponent textEditComponent(&engine);
+ textEditComponent.setData(componentStr.toLatin1(), QUrl());
+ QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit*>(textEditComponent.create());
+ QVERIFY(textEdit != 0);
+
+ QQuickWindow window;
+ textEdit->setParentItem(window.contentItem());
+ window.show();
+ window.requestActivate();
+ QTest::qWaitForWindowActive(&window);
+ QVERIFY(textEdit->hasActiveFocus());
+
+ QSignalSpy spy(textEdit, SIGNAL(canUndoChanged()));
+
+ textEdit->setText("I am Legend");
+ QCOMPARE(textEdit->text(), QString("I am Legend"));
+ textEdit->clear();
+ QVERIFY(textEdit->text().isEmpty());
+
+ QCOMPARE(spy.count(), 1);
+
+ // checks that clears can be undone
+ textEdit->undo();
+ QVERIFY(!textEdit->canUndo());
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(textEdit->text(), QString("I am Legend"));
+
+ textEdit->setCursorPosition(4);
+ QInputMethodEvent preeditEvent("PREEDIT", QList<QInputMethodEvent::Attribute>());
+ QGuiApplication::sendEvent(textEdit, &preeditEvent);
+ QCOMPARE(textEdit->text(), QString("I am Legend"));
+ QCOMPARE(textEdit->preeditText(), QString("PREEDIT"));
+
+ textEdit->clear();
+ QVERIFY(textEdit->text().isEmpty());
+
+ QCOMPARE(spy.count(), 3);
+
+ // checks that clears can be undone
+ textEdit->undo();
+ QVERIFY(!textEdit->canUndo());
+ QCOMPARE(spy.count(), 4);
+ QCOMPARE(textEdit->text(), QString("I am Legend"));
+
+ textEdit->setText(QString("<i>I am Legend</i>"));
+ QCOMPARE(textEdit->text(), QString("<i>I am Legend</i>"));
+ textEdit->clear();
+ QVERIFY(textEdit->text().isEmpty());
+
+ QCOMPARE(spy.count(), 5);
+
+ // checks that clears can be undone
+ textEdit->undo();
+ QCOMPARE(spy.count(), 6);
+ QCOMPARE(textEdit->text(), QString("<i>I am Legend</i>"));
+}
+
void tst_qquicktextedit::baseUrl()
{
QUrl localUrl("file:///tests/text.qml");