QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?

QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?

问题描述:

我有QTreeViewQAbstractItemModel的子类,目前我正在使用拖放操作将项目从一个父索引移动到另一个父索引。我还想添加重新排列同一父索引内项目顺序的功能。当用户在两个其他项目之间放置一个项目时,我需要确定是否应该放入或放入它们之间。我还想在鼠标移动时在两个项目之间绘制一条黑线,以提示将会发生什么,类似于许多其他树型视图(例如,大多数操作系统上的文件浏览器),如附图所示:QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?

拖动到现有项目:

drag into

插入之间现有的两个项目:

drag in-between

不会自动Qt的拖累,这部分/拖放行为,还是我必须手动计算相对于树项目边缘的鼠标位置?另外,如何在QTreeView中的两个项目之间画一条临时线?

我几乎做同样的事情,前一段时间,我能想到的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 
} 

“红利”:您可以通过PrimitiveElementPE_IndicatorItemViewItemDrop访问下降指标在你自己的风格。 你可以看到如何定制它herehere

+0

这完美的作品。 – Carlton