Qt 5.4の時点で(そしてこれはQt 4.8でも当てはまると思います)、に設定するDragDropOverwriteMode
とtrue
、ドラッグは既存のアイテムにのみドロップ可能になり、「アイテムの上/下」のドロップターゲットが表示されなくなります。
また、質問が主張するものとは異なり、デフォルトでにDragDropOverwriteMode
設定されているため(チェックしていませんが、新しいQtバージョンである可能性があります)、手動で設定する必要があります。false
QTreeView
true
ただし、アイテムをドロップできる位置を計算できると便利です。たとえば、QTreeViewでは、ドラッグしたものをアイテムの左マージン、つまり下の赤い領域にドロップすることはできません。

無効な赤い領域に何かがドロップされた場合、引数をに設定してdropMimeData
呼び出されます。したがって、事前に「ここにドロップできない」カーソルをユーザーに表示して、ユーザーがそこにドロップできないことを認識しておくと便利です。Qtは、ドラッグ中に無効な領域でマウスカーソルを変更することを実装していません(Qt 5.4以降)が、次のように行うことができます。parent
NULL
ignore
dragMoveEvent
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
ます。