2016-07-06 7 views
2

私はQTreeViewQAbstractItemModelのサブクラスを持っていますが、現在、ドラッグ・ドロップを使用して親インデックスから別のインデックスにアイテムを移動しています。同じ親インデックス内のアイテムの順序を並べ替える機能も追加したいと思います。ユーザーが他の2つのアイテムの間にアイテムをドロップすると、そのドロップをその中に入れるべきかどうかを判断する必要があります。私はまた、添付された画像のように、他の多くのツリータイプのビュー(ほとんどのオペレーティングシステムのファイルエクスプローラなど)と同様に、マウスが移動するにつれて2つの項目の間に暗い線を引いて、何が起こるかのヒントを得たいと思います。既存のアイテムへのQTreeView - ドラッグ/ドロップイベントが並べ替えや親の間の移動であるかどうかを確認する方法?

ドラッグ:既存の2つの項目間の

drag into

インサート:

drag in-between

んQtは/ドラッグのこの部分を自動化ツリーの項目の端に相対的なマウスの位置を手動で計算する必要がありますか?また、QTreeViewの2つの項目の間に仮の線を描画するにはどうすればよいですか?

答えて

1

私はいくつかの時間前にはほぼ同じことをした、と私は3つの事を考えることができます:あなたはdropEvent()を再実装する必要があり、そして多分あなたのdragMoveEvent()ます

ここには、私がしていたことの非常に小さな例があります。

dragMoveEvent()では、私はドロップ指標を示していました。この方法では、オブジェクトをドラッグしているときに常にドロップインジケータが表示されます。 dropEvent()

void MyTreeView::dragMoveEvent(QDragMoveEvent* event) 
{ 
    setDropIndicatorShown(true); 
    QTreeView::dragMoveEvent(event); 
} 

、私はそれぞれのケースを管理していた、それは私がドラッグされたアイテムは、その下またはビューポート上で、その上、他の項目にあったならば言うことです。そして、それに応じて、私は自分のドロップを管理していて、イベントの最後に、ドロップインジケータを隠しました。

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 
} 

"ボーナス":あなたはPrimitiveElementPE_IndicatorItemViewItemDropすることにより、独自のスタイルでドロップインジケータにアクセスすることができます。 herehereをカスタマイズする方法がわかります。

+0

これは完全に機能します。 – Carlton

関連する問題