我有QTreeView
和QAbstractItemModel
的子类,目前我正在使用拖放功能将项目从一个父索引移动到另一个父索引。我还想添加重新排列同一父索引中项目顺序的功能。当用户在两个其他项目之间删除项目时,我需要确定是否应该在它们之间或之间进行删除。我还想在鼠标移动时在两个项目之间绘制一条暗线,以暗示将要发生的事情,类似于许多其他树型视图(例如,大多数操作系统上的文件浏览器),如附图所示:
拖入现有项目:
在两个现有项目之间插入:
Qt会自动执行拖放行为的这一部分,还是必须手动计算相对于树项边缘的鼠标位置?另外,如何在QTreeView
?
答案 0 :(得分:3)
前段时间我做了几乎相同的事情,我可以想到3件事:
dropEvent()
,也许是dragMoveEvent()
; 这是我正在做的一个非常小的例子。
在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
以自己的方式访问放置指示符。
您可以查看如何自定义here和here。