C++ (Qt)bool SomeClass::eventFilter(QObject *obj, QEvent *event){ if (event->type() == QEvent::Drop && obj == treeWidget) { QDropEvent *dropEvent = static_cast<QDropEvent*>(event); QTreeWidgetItem *draggedItem = treeWidget->currentItem(); QTreeWidgetItem *droppedOnItem = treeWidget->itemAt(dropEvent->pos()); Q_ASSERT(draggedItem); Q_ASSERT(droppedOnItem); if (!droppedOnItem || !draggedItem) return false; if (draggedItem == droppedOnItem) return false; int draggedItemIdx = treeWidget->indexOfTopLevelItem(draggedItem); int droppedOnItemIdx = treeWidget->indexOfTopLevelItem(droppedOnItem); Q_ASSERT(draggedItemIdx >= 0); Q_ASSERT(droppedOnItemIdx >= 0); <do_something with indexes or items> return false; //event should be handled in QTreeWidget } return BaseClass::eventFilter(obj, event);}
C++ (Qt)QAbstractItemView::DropIndicatorPositionQAbstractItemViewPrivate::position(const QPoint &pos, const QRect &rect, const QModelIndex &index) const{ QAbstractItemView::DropIndicatorPosition r = QAbstractItemView::OnViewport; if (!overwrite) { const int margin = 2; if (pos.y() - rect.top() < margin) { r = QAbstractItemView::AboveItem; } else if (rect.bottom() - pos.y() < margin) { r = QAbstractItemView::BelowItem; } else if (rect.contains(pos, true)) { r = QAbstractItemView::OnItem; } } else { QRect touchingRect = rect; touchingRect.adjust(-1, -1, 1, 1); if (touchingRect.contains(pos, false)) { r = QAbstractItemView::OnItem; } } if (r == QAbstractItemView::OnItem && (!(model->flags(index) & Qt::ItemIsDropEnabled))) r = pos.y() < rect.center().y() ? QAbstractItemView::AboveItem : QAbstractItemView::BelowItem; return r;}
C++ (Qt)dropIndicatorPosition = position(event->pos(), q->visualRect(index), index);
C++ (Qt)const int margin = 2;if (pos.y() - rect.top() < margin) { r = QAbstractItemView::AboveItem;} else if (rect.bottom() - pos.y() < margin) { r = QAbstractItemView::BelowItem;} else if (rect.contains(pos, true)) { r = QAbstractItemView::OnItem;}
C++ (Qt)ui.treeWidget->installEventFilter(this);
C++ (Qt)setDragEnabled(true);setAcceptDrops(true);setDropIndicatorShown(true);
C++ (Qt)ui.treeWidget->viewport()->installEventFilter(this);