From efec288f58dc18f6a571bfedf9d19e3fbf12a18f Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 17 Jan 2018 13:53:19 +0100 Subject: 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 Reviewed-by: Christian Ehrlicher --- src/widgets/itemviews/qabstractitemview.cpp | 20 ++++++++++++++++++++ src/widgets/itemviews/qabstractitemview.h | 1 + 2 files changed, 21 insertions(+) (limited to 'src') 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(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 diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h index 96745a84ea..8a138bdb67 100644 --- a/src/widgets/itemviews/qabstractitemview.h +++ b/src/widgets/itemviews/qabstractitemview.h @@ -346,6 +346,7 @@ protected: void resizeEvent(QResizeEvent *event) override; void timerEvent(QTimerEvent *event) override; void inputMethodEvent(QInputMethodEvent *event) override; + bool eventFilter(QObject *object, QEvent *event) override; #ifndef QT_NO_DRAGANDDROP enum DropIndicatorPosition { OnItem, AboveItem, BelowItem, OnViewport }; -- cgit v1.2.3