作爲Qt的5.4的(我假定這是真實的,即使在Qt的4.8),設置DragDropOverwriteMode
到true
將正確使拖動是可投放僅在現有項,並防止「上方/下方項目」放置目標從出現。
而且,不像什麼的問題索賠,DragDropOverwriteMode
默認情況下爲QTreeView
設置爲false
(我沒有檢查,也許是新的Qt版本),所以它需要手動設置爲true
。
但是,能夠計算物品可丟棄的位置仍然很有用。例如,在QTreeView則,一個不能落個拖事情上的項目的左邊距,即低於紅色區域:
如果事情是無效的紅色區域下降,dropMimeData
將有一個名爲參數設置爲NULL
。因此,ignore
dragMoveEvent
提前顯示'你不能放在這裏'光標到用戶將是有用的,所以他們知道他們不能放在那裏。Qt不執行改變鼠標光標無效區域,同時拖動(如Qt的5.4),但我們可以做這樣的:
bool SubclassedTreeView::dropResultsInValidIndex(const QPoint& pos)
{
QTreeWidgetItem* item = itemAt(pos);
if (item == NULL || !indexFromItem(item).isValid())
return false;
return visualRect(indexFromItem(item)).adjusted(-1, -1, 1, 1).contains(pos, false);
}
virtual void SubclassedTreeView::dragMoveEvent(QDragMoveEvent* event)
{
QTreeWidget::dragMoveEvent(event);
if (!event->isAccepted())
return;
if (dropResultsInValidIndex(event->pos()))
event->accept();
else
event->ignore(); //Show 'forbidden' cursor.
}
virtual bool SubclassedTreeView::dropMimeData(QTreeWidgetItem* parent, int index, const QMimeData* data, Qt::DropAction action)
{
Q_UNUSED(index);
//Modify the following action and data format checks to suit your needs:
if (parent == NULL || action != Qt::CopyAction || !data->hasFormat("my/preferred-type"))
return false;
QModelIndex modelIndex = indexFromItem(parent);
//modelIndex is where the data is dropped onto. Implement your custom drop action here...
return true;
}
上面的代碼中包含一小部分visualRect….adjusted(-1, -1, 1, 1)
這是從QAbstractItemViewPrivate::position
來源被盜。實際上,當QAbstractItemViewPrivate::position
爲false
時,此功能的來源也可用於計算該項目的覆蓋/插入/無效區域。
現在找到答案。請參閱Matt的回答評論。 – giles123