summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp10
-rw-r--r--src/widgets/itemviews/qitemdelegate.cpp5
-rw-r--r--src/widgets/itemviews/qstyleditemdelegate.cpp5
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp54
4 files changed, 63 insertions, 11 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 771753b7da..77e683643e 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -2753,10 +2753,14 @@ void QAbstractItemView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndE
editor->removeEventFilter(d->delegateForIndex(index));
d->removeEditor(editor);
}
- if (hadFocus)
- setFocus(); // this will send a focusLost event to the editor
- else
+ if (hadFocus) {
+ if (focusPolicy() != Qt::NoFocus)
+ setFocus(); // this will send a focusLost event to the editor
+ else
+ editor->clearFocus();
+ } else {
d->checkPersistentEditorFocus();
+ }
QPointer<QWidget> ed = editor;
QApplication::sendPostedEvents(editor, 0);
diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp
index 0b654a7485..6a1fe22395 100644
--- a/src/widgets/itemviews/qitemdelegate.cpp
+++ b/src/widgets/itemviews/qitemdelegate.cpp
@@ -1210,13 +1210,10 @@ bool QItemDelegate::eventFilter(QObject *object, QEvent *event)
case Qt::Key_Escape:
// don't commit data
emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache);
- break;
+ return true;
default:
return false;
}
- if (editor->parentWidget())
- editor->parentWidget()->setFocus();
- return true;
} else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) {
//the Hide event will take care of he editors that are in fact complete dialogs
if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) {
diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp
index c2aa630918..da5aeb3290 100644
--- a/src/widgets/itemviews/qstyleditemdelegate.cpp
+++ b/src/widgets/itemviews/qstyleditemdelegate.cpp
@@ -678,13 +678,10 @@ bool QStyledItemDelegate::eventFilter(QObject *object, QEvent *event)
case Qt::Key_Escape:
// don't commit data
emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache);
- break;
+ return true;
default:
return false;
}
- if (editor->parentWidget())
- editor->parentWidget()->setFocus();
- return true;
} else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) {
//the Hide event will take care of he editors that are in fact complete dialogs
if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) {
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index c3aaf6be16..b8875c638d 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -60,6 +60,7 @@
#include <qlineedit.h>
#include <qscreen.h>
#include <qscopedpointer.h>
+#include <qstyleditemdelegate.h>
static inline void setFrameless(QWidget *w)
{
@@ -244,6 +245,8 @@ private slots:
void testChangeEditorState();
void deselectInSingleSelection();
void testNoActivateOnDisabledItem();
+ void testFocusPolicy_data();
+ void testFocusPolicy();
};
class MyAbstractItemDelegate : public QAbstractItemDelegate
@@ -1728,5 +1731,56 @@ void tst_QAbstractItemView::testNoActivateOnDisabledItem()
QCOMPARE(activatedSpy.count(), 0);
}
+void tst_QAbstractItemView::testFocusPolicy_data()
+{
+ QTest::addColumn<QAbstractItemDelegate*>("delegate");
+
+ QAbstractItemDelegate *styledItemDelegate = new QStyledItemDelegate(this);
+ QAbstractItemDelegate *itemDelegate = new QItemDelegate(this);
+
+ QTest::newRow("QStyledItemDelegate") << styledItemDelegate;
+ QTest::newRow("QItemDelegate") << itemDelegate;
+}
+
+void tst_QAbstractItemView::testFocusPolicy()
+{
+ QFETCH(QAbstractItemDelegate*, delegate);
+
+ QWidget window;
+ QTableView *table = new QTableView(&window);
+ table->setItemDelegate(delegate);
+ QVBoxLayout *layout = new QVBoxLayout(&window);
+ layout->addWidget(table);
+
+ QStandardItemModel model;
+ model.setRowCount(10);
+ model.setColumnCount(10);
+ table->setModel(&model);
+ table->setCurrentIndex(model.index(1, 1));
+
+ centerOnScreen(&window);
+ moveCursorAway(&window);
+
+ window.show();
+ QApplication::setActiveWindow(&window);
+ QVERIFY(QTest::qWaitForWindowActive(&window));
+
+ // itemview accepts focus => editor is closed => return focus to the itemview
+ QPoint clickpos = table->visualRect(model.index(1, 1)).center();
+ QTest::mouseDClick(table->viewport(), Qt::LeftButton, Qt::NoModifier, clickpos);
+ QWidget *editor = qApp->focusWidget();
+ QVERIFY(editor);
+ QTest::keyClick(editor, Qt::Key_Escape, Qt::NoModifier);
+ QCOMPARE(qApp->focusWidget(), table);
+
+ // itemview doesn't accept focus => editor is closed => clear the focus
+ table->setFocusPolicy(Qt::NoFocus);
+ QTest::mouseDClick(table->viewport(), Qt::LeftButton, Qt::NoModifier, clickpos);
+ editor = qApp->focusWidget();
+ QVERIFY(editor);
+ QTest::keyClick(editor, Qt::Key_Escape, Qt::NoModifier);
+ QVERIFY(!qApp->focusWidget());
+}
+
QTEST_MAIN(tst_QAbstractItemView)
#include "tst_qabstractitemview.moc"