繁体   English   中英

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

[英]QTreeView - how to tell if a drag/drop event is a reorder or a move between parents?

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

拖到现有项目中:

拖入

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

拖入中间

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
}

“Bonus” :您可以通过PrimitiveElement PE_IndicatorItemViewItemDrop以您自己的风格访问drop指示器。 你可以在这里这里看到如何自定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM