3

andのサブクラスがQTreeViewありQAbstractItemModel、現在、ドラッグドロップを使用して、ある親インデックスから別の親インデックスにアイテムを移動しています。同じ親インデックス内の項目の順序を並べ替える機能も追加したいと考えています。ユーザーが他の 2 つのアイテムの間にアイテムをドロップした場合、ドロップがそれらのアイテムの中にあるのか、それともその間にあるのかを判断する必要があります。また、添付の図のように、他の多くのツリー タイプ ビュー (ほとんどのオペレーティング システムのファイル エクスプローラーなど) と同様に、何が起こるかを示唆するために、マウスを動かすと 2 つの項目の間に暗い線を引きたいと思います。

既存のアイテムにドラッグします:

にドラッグ

2 つの既存のアイテムの間に挿入します。

間にドラッグ

Qt はドラッグ/ドロップ動作のこの部分を自動化しますか、それともツリー アイテムのエッジに対するマウスの位置を手動で計算する必要がありますか? また、 の 2 つのアイテムの間に一時的な線を引くにはどうすればよいQTreeViewですか?

4

1 に答える 1

4

少し前にほぼ同じことをしましたが、次の 3 つのことが考えられます。

  • dropEvent()あなたの、そしておそらくあなたのdragMoveEvent();を再実装する必要があります。
  • アイテムをドロップしている場所を確認するには、dropIndicatorPosition()を使用します。
  • ドロップ インジケーターを表示するには、setDropIndicatorShown(bool)を使用します。

これは、私が行っていたことの非常に最小限の例です。

では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。カスタマイズ方法はこちらこちらでご覧いただけます。

于 2016-07-07T07:29:46.003 に答える