diff options
author | Andy Shaw <andy.shaw@qt.io> | 2018-01-17 13:53:19 +0100 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2018-01-22 09:50:03 +0000 |
commit | efec288f58dc18f6a571bfedf9d19e3fbf12a18f (patch) | |
tree | 59ce0f85f5131c4285228d2ddc03a0784dc01a2a /src/widgets/itemviews/qabstractitemview.cpp | |
parent | 6f9c5c85ca37e1fd1203317d4ed31ac33c0f1124 (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.cpp | 20 |
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 |