diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.cpp | 17 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemview_p.h | 3 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index cfb6a3151a..5afdd93b34 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -86,6 +86,7 @@ QAbstractItemViewPrivate::QAbstractItemViewPrivate() selectionMode(QAbstractItemView::ExtendedSelection), selectionBehavior(QAbstractItemView::SelectItems), currentlyCommittingEditor(nullptr), + pressClosedEditor(false), pressedModifiers(Qt::NoModifier), pressedPosition(QPoint(-1, -1)), pressedAlreadySelected(false), @@ -1777,6 +1778,9 @@ void QAbstractItemView::mousePressEvent(QMouseEvent *event) QPoint pos = event->position().toPoint(); QPersistentModelIndex index = indexAt(pos); + // this is the mouse press event that closed the last editor (via focus event) + d->pressClosedEditor = d->pressClosedEditorWatcher.isActive() && d->lastEditedIndex == index; + if (!d->selectionModel || (d->state == EditingState && d->hasEditor(index))) return; @@ -1935,16 +1939,17 @@ void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event) bool click = (index == d->pressedIndex && index.isValid() && !releaseFromDoubleClick); bool selectedClicked = click && (event->button() == Qt::LeftButton) && d->pressedAlreadySelected; EditTrigger trigger = (selectedClicked ? SelectedClicked : NoEditTriggers); - const bool edited = click ? edit(index, trigger, event) : false; + const bool edited = click && !d->pressClosedEditor ? edit(index, trigger, event) : false; d->ctrlDragSelectionFlag = QItemSelectionModel::NoUpdate; if (d->selectionModel && d->noSelectionOnMousePress) { d->noSelectionOnMousePress = false; - if (!edited) + if (!edited && !d->pressClosedEditor) d->selectionModel->select(index, selectionCommand(index, event)); } + d->pressClosedEditor = false; setState(NoState); if (click) { @@ -2584,6 +2589,8 @@ void QAbstractItemView::timerEvent(QTimerEvent *event) //we only get here if there was no double click if (d->pressedIndex.isValid() && d->pressedIndex == currentIndex()) scrollTo(d->pressedIndex); + } else if (event->timerId() == d->pressClosedEditorWatcher.timerId()) { + d->pressClosedEditorWatcher.stop(); } } @@ -2854,6 +2861,12 @@ void QAbstractItemView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndE if (!index.isValid()) return; // the editor was not registered + // start a timer that expires immediately when we return to the event loop + // to identify whether this close was triggered by a mousepress-initiated + // focus event + d->pressClosedEditorWatcher.start(0, this); + d->lastEditedIndex = index; + if (!isPersistent) { setState(NoState); QModelIndex index = d->indexForEditor(editor); diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h index 521d341b8f..f45d642dcf 100644 --- a/src/widgets/itemviews/qabstractitemview_p.h +++ b/src/widgets/itemviews/qabstractitemview_p.h @@ -364,6 +364,9 @@ public: QIndexEditorHash indexEditorHash; QSet<QWidget*> persistent; QWidget *currentlyCommittingEditor; + QBasicTimer pressClosedEditorWatcher; + QPersistentModelIndex lastEditedIndex; + bool pressClosedEditor; QPersistentModelIndex enteredIndex; QPersistentModelIndex pressedIndex; |