QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?
问题描述:
我有QTreeView
和QAbstractItemModel
的子类,目前我正在使用拖放操作将项目从一个父索引移动到另一个父索引。我还想添加重新排列同一父索引内项目顺序的功能。当用户在两个其他项目之间放置一个项目时,我需要确定是否应该放入或放入它们之间。我还想在鼠标移动时在两个项目之间绘制一条黑线,以提示将会发生什么,类似于许多其他树型视图(例如,大多数操作系统上的文件浏览器),如附图所示:QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?
拖动到现有项目:
插入之间现有的两个项目:
不会自动Qt的拖累,这部分/拖放行为,还是我必须手动计算相对于树项目边缘的鼠标位置?另外,如何在QTreeView
中的两个项目之间画一条临时线?
答
我几乎做同样的事情,前一段时间,我能想到的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
}
“红利”:您可以通过PrimitiveElementPE_IndicatorItemViewItemDrop
访问下降指标在你自己的风格。 你可以看到如何定制它here和here。
这完美的作品。 – Carlton