diff options
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 19 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 9 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 9 |
3 files changed, 25 insertions, 12 deletions
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 216f44fd9c..205203730d 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -921,7 +921,8 @@ void QListView::dropEvent(QDropEvent *event) bool topIndexDropped = false; int col = -1; int row = -1; - if (d->dropOn(event, &row, &col, &topIndex)) { + // check whether a subclass has already accepted the event, ie. moved the data + if (!event->isAccepted() && d->dropOn(event, &row, &col, &topIndex)) { const QList<QModelIndex> selIndexes = selectedIndexes(); QList<QPersistentModelIndex> persIndexes; persIndexes.reserve(selIndexes.count()); @@ -940,23 +941,29 @@ void QListView::dropEvent(QDropEvent *event) QPersistentModelIndex dropRow = model()->index(row, col, topIndex); int r = row == -1 ? model()->rowCount() : (dropRow.row() >= 0 ? dropRow.row() : row); + bool dataMoved = false; for (int i = 0; i < persIndexes.count(); ++i) { const QPersistentModelIndex &pIndex = persIndexes.at(i); if (r != pIndex.row()) { // try to move (preserves selection) - d->dropEventMoved |= model()->moveRow(QModelIndex(), pIndex.row(), QModelIndex(), r); - if (!d->dropEventMoved) // can't move - abort and let QAbstractItemView handle this + dataMoved |= model()->moveRow(QModelIndex(), pIndex.row(), QModelIndex(), r); + if (!dataMoved) // can't move - abort and let QAbstractItemView handle this break; } else { // move onto itself is blocked, don't delete anything - d->dropEventMoved = true; + dataMoved = true; } r = pIndex.row() + 1; // Dropped items are inserted contiguously and in the right order. } - if (d->dropEventMoved) - event->accept(); // data moved, nothing to be done in QAbstractItemView::dropEvent + if (dataMoved) + event->accept(); } } + + // either we or a subclass accepted the move event, so assume that the data was + // moved and that QAbstractItemView shouldn't remove the source when QDrag::exec returns + if (event->isAccepted()) + d->dropEventMoved = true; } if (!d->commonListView->filterDropEvent(event) || !d->dropEventMoved) { diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index f01d392545..5072cc9240 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -2679,7 +2679,8 @@ void QTableWidget::dropEvent(QDropEvent *event) { QModelIndex topIndex; int col = -1; int row = -1; - if (d->dropOn(event, &row, &col, &topIndex)) { + // check whether a subclass has already accepted the event, ie. moved the data + if (!event->isAccepted() && d->dropOn(event, &row, &col, &topIndex)) { const QModelIndexList indexes = selectedIndexes(); int top = INT_MAX; int left = INT_MAX; @@ -2701,9 +2702,11 @@ void QTableWidget::dropEvent(QDropEvent *event) { } event->accept(); - // Don't want QAbstractItemView to delete it because it was "moved" we already did it - d->dropEventMoved = true; } + // either we or a subclass accepted the move event, so assume that the data was + // moved and that QAbstractItemView shouldn't remove the source when QDrag::exec returns + if (event->isAccepted()) + d->dropEventMoved = true; } QTableView::dropEvent(event); diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index e1f7da6fcd..08b1137c5c 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -3340,7 +3340,8 @@ void QTreeWidget::dropEvent(QDropEvent *event) { QModelIndex topIndex; int col = -1; int row = -1; - if (d->dropOn(event, &row, &col, &topIndex)) { + // check whether a subclass has already accepted the event, ie. moved the data + if (!event->isAccepted() && d->dropOn(event, &row, &col, &topIndex)) { const QList<QModelIndex> idxs = selectedIndexes(); QList<QPersistentModelIndex> indexes; const int indexesCount = idxs.count(); @@ -3387,9 +3388,11 @@ void QTreeWidget::dropEvent(QDropEvent *event) { } event->accept(); - // Don't want QAbstractItemView to delete it because it was "moved" we already did it - d->dropEventMoved = true; } + // either we or a subclass accepted the move event, so assume that the data was + // moved and that QAbstractItemView shouldn't remove the source when QDrag::exec returns + if (event->isAccepted()) + d->dropEventMoved = true; } QTreeView::dropEvent(event); |