summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp14
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p.h1
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp40
3 files changed, 55 insertions, 0 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index e05f4e4..1042cf1 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -994,6 +994,20 @@ void QDeclarativeTextEditPrivate::focusChanged(bool hasFocus)
QDeclarativeItemPrivate::focusChanged(hasFocus);
}
+void QDeclarativeTextEdit::focusOutEvent(QFocusEvent *event)
+{
+ Q_D(QDeclarativeTextEdit);
+ if (event->reason() != Qt::ActiveWindowFocusReason
+ && event->reason() != Qt::PopupFocusReason) {
+ QTextCursor cursor = d->control->textCursor();
+ if (cursor.hasSelection()) {
+ cursor.clearSelection();
+ d->control->setTextCursor(cursor);
+ }
+ }
+ QDeclarativePaintedItem::focusOutEvent(event);
+}
+
/*!
\qmlmethod void TextEdit::selectAll()
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
index 68fde3d..6826cb5 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
@@ -249,6 +249,7 @@ protected:
void keyPressEvent(QKeyEvent *);
void keyReleaseEvent(QKeyEvent *);
void focusInEvent(QFocusEvent *event);
+ void focusOutEvent(QFocusEvent *event);
// mouse filter?
void mousePressEvent(QGraphicsSceneMouseEvent *event);
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index a7971cc..ed02451 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -110,6 +110,7 @@ private slots:
void mouseSelection_data();
void mouseSelection();
void inputMethodHints();
+ void clearSelectionOnFocusLost();
void cursorDelegate();
void delegateLoading_data();
@@ -748,6 +749,45 @@ void tst_qdeclarativetextedit::inputMethodHints()
QVERIFY(textEditObject->inputMethodHints() & Qt::ImhUppercaseOnly);
}
+// QTBUG-15341
+void tst_qdeclarativetextedit::clearSelectionOnFocusLost()
+{
+
+ // create a visible scene with two text edits
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ QDeclarativeTextEdit edit;
+ QDeclarativeTextEdit secondEdit;
+ edit.setText("Hello world!");
+ scene.addItem(&edit);
+ scene.addItem(&secondEdit);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ int index = 0;
+ while (index < Qt::NoFocusReason) {
+
+ // focus the first text edit and select text
+ edit.setFocus(true);
+ edit.selectAll();
+ QVERIFY(edit.hasActiveFocus() && !secondEdit.hasActiveFocus());
+ QCOMPARE(edit.selectedText().size(), 12);
+
+ // lose focus in the first text edit
+ qobject_cast<QGraphicsObject*>(&secondEdit)->setFocus(Qt::FocusReason(index));
+ QVERIFY(!edit.hasActiveFocus() && secondEdit.hasActiveFocus());
+
+ // depending on the focus reason, selection should now be cleared
+ bool clearSelection = (index != Qt::ActiveWindowFocusReason && index != Qt::PopupFocusReason);
+ QCOMPARE(edit.selectedText().isEmpty(), clearSelection);
+ index++;
+ }
+}
+
+
+
void tst_qdeclarativetextedit::cursorDelegate()
{
QDeclarativeView* view = createView(SRCDIR "/data/cursorTest.qml");