3

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

拖入现有项目:

拖入

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

夹在中间

Qt 是否自动执行这部分拖放行为,还是我必须手动计算鼠标相对于树项边缘的位置?另外,我怎样才能在两个项目之间画一条临时线QTreeView

4

1 回答 1

4

前段时间我做了几乎同样的事情,我能想到 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您可以在此处此处查看如何自定义它。

于 2016-07-07T07:29:46.003 回答