は、正しくドラッグだけで、既存のアイテムのドロップ可能にさせると、「上記/項目下の」ドロップターゲットを防ぎます出現から。
また、どのような質問の主張とは異なり、DragDropOverwriteMode
は(私は多分それは新しいQtのバージョンだ、チェックしませんでした)QTreeView
にデフォルトでfalse
に設定するので、手動でtrue
に設定する必要があります。
ただし、アイテムをドロップできる位置を計算できることは、依然として有効です。何かが無効な赤の領域にドロップされた場合
、dropMimeData
がで呼び出されます:QTreeViewの例では、1は、下記の赤い部分、つまり、項目の左余白にドラッグしたものを削除することはできませんparent
引数はNULL
に設定されています。だから、 dragMoveEvent
にはのユーザーに「ここにはドロップできません」というカーソルが表示され、そこでドロップできないことがわかっているので、ignore
に役立ちます。(Qtの5.4のように)ドラッグ中Qtは、無効な領域にマウスカーソルを変更し実装していないが、我々はこのようにそれを行うことができます。
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;
}
上記のコードはQAbstractItemViewPrivate::position
源から盗まれた小さな部分visualRect….adjusted(-1, -1, 1, 1)
が含まれています。実際には、QAbstractItemViewPrivate::position
がfalse
の場合、この関数のソースを使用して項目の上書き/挿入/無効領域を計算することができます。
答えが見つかりました。 Mattの答えに対するコメントを参照してください。 – giles123