summaryrefslogtreecommitdiffstats
path: root/src/widgets/itemviews/qabstractitemview.cpp
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2018-01-17 13:53:19 +0100
committerAndy Shaw <andy.shaw@qt.io>2018-01-22 09:50:03 +0000
commitefec288f58dc18f6a571bfedf9d19e3fbf12a18f (patch)
tree59ce0f85f5131c4285228d2ddc03a0784dc01a2a /src/widgets/itemviews/qabstractitemview.cpp
parent6f9c5c85ca37e1fd1203317d4ed31ac33c0f1124 (diff)
itemviews: When an index widget gets focus, update the current index
By ensuring that the current index follows the focus of an index widget, we can ensure that moving the cursor will happen in the way that is expected from the focused widget. Task-number: QTBUG-27793 Change-Id: Ia36891a94ce41c7d12fba678de23a6f3b69374ae Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io> Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
Diffstat (limited to 'src/widgets/itemviews/qabstractitemview.cpp')
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 5bf4fec92c..a07297863d 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -3217,12 +3217,14 @@ void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget
if (QWidget *oldWidget = indexWidget(index)) {
d->persistent.remove(oldWidget);
d->removeEditor(oldWidget);
+ oldWidget->removeEventFilter(this);
oldWidget->deleteLater();
}
if (widget) {
widget->setParent(viewport());
d->persistent.insert(widget);
d->addEditor(index, widget, true);
+ widget->installEventFilter(this);
widget->show();
dataChanged(index, index); // update the geometry
if (!d->delayedPendingLayout)
@@ -4499,6 +4501,24 @@ QModelIndexList QAbstractItemViewPrivate::selectedDraggableIndexes() const
return indexes;
}
+/*!
+ \reimp
+*/
+
+bool QAbstractItemView::eventFilter(QObject *object, QEvent *event)
+{
+ Q_D(QAbstractItemView);
+ if (object == this || object == viewport() || event->type() != QEvent::FocusIn)
+ return QAbstractScrollArea::eventFilter(object, event);
+ QWidget *widget = qobject_cast<QWidget *>(object);
+ // If it is not a persistent widget then we did not install
+ // the event filter on it, so assume a base implementation is
+ // filtering
+ if (!widget || !d->persistent.contains(widget))
+ return QAbstractScrollArea::eventFilter(object, event);
+ setCurrentIndex(d->indexForEditor(widget));
+ return false;
+}
QT_END_NAMESPACE