少し前にほぼ同じことをしましたが、次の 3 つのことが考えられます。
これは、私が行っていたことの非常に最小限の例です。
ではdragMoveEvent()
、ドロップ インジケータを表示していました。これにより、オブジェクトをドラッグしているときに常にドロップ インジケーターが表示されます。
void MyTreeView::dragMoveEvent(QDragMoveEvent* event)
{
setDropIndicatorShown(true);
QTreeView::dragMoveEvent(event);
}
では、dropEvent()
ドラッグしているアイテムが別のアイテム上にあるか、その上にあるか、その下にあるか、ビューポートにあるか、それぞれのケースを管理していました。そしたらそれによると自分のドロップを管理していて、イベントの最後にドロップインジケーターを隠した。
void MyTreeView::dropEvent(QDropEvent* event)
{
bool dropOK = false;
DropIndicatorPosition dropIndicator = dropIndicatorPosition();
switch (dropIndicator)
{
case QAbstractItemView::AboveItem:
dropOK = true;
break;
case QAbstractItemView::BelowItem:
dropOK = true;
break;
case QAbstractItemView::OnItem:
dropOK = false;
break;
case QAbstractItemView::OnViewport:
dropOK = false;
break;
}
if(dropOK)
{
// Here, you need to manage yourself the case of dropping an item
}
setDropIndicatorShown(false); // hide the drop indicator once the drop is done
}
「おまけ」 : PrimitiveElement によって独自のスタイルでドロップ インジケーターにアクセスできますPE_IndicatorItemViewItemDrop
。カスタマイズ方法はこちらとこちらでご覧いただけます。