我将一个QTreeWidget子类化,将其 dragDropMode 设置为 InternalMove 并使用自定义项填充它,其中一些可以被拖动,其他可以接受丢弃。用户可以按预期在树周围移动项目。但我需要通知项目顺序的变化并做出适当的反应。不幸的是,没有信号与我可以连接的树内物品的移动相关联。
我尝试获取QTreeWidget底层模型()的句柄,然后连接到其 rowsMoved 信号,但在内部移动期间似乎没有发出。
我重新实现了QTreeWidget的 dropEvent(),但是没有办法确定那里的目标行索引。
显然, dropMimeData()事件根本不会被内部移动调用。
我可以尝试其他任何方法吗?感谢。
答案 0 :(得分:6)
在重新实现的dropEvent()
中,您应该能够找到目标行索引和项目:
void
subclass::dropEvent(QDropEvent* event)
{
QModelIndex index = indexAt(event->pos());
if (!index.isValid()) { // just in case
event->setDropAction(Qt::IgnoreAction);
return;
}
QTreeWidgetItem* destination_item = itemFromIndex(index);
....
}
答案 1 :(得分:1)
顺便提一下,我想出了另一种方法来找出哪个元素准确移动到哪里,哪个回避整个 dropIndicatorPosition()和相关的 itemAbove(),itemBelow()在不同父母之间移动物品时,或者至少可以帮助补充它:
void MyTreeWidget::dropEvent(QDropEvent *event)
{
// get the list of the items that are about to be dragged
QList<QTreeWidgetItem*> dragItems = selectedItems();
// find out their row numbers before the drag
QList<int> fromRows;
QTreeWidgetItem *item;
foreach(item, dragItems) fromRows.append(indexFromItem(item).row());
// the default implementation takes care of the actual move inside the tree
QTreeWidget::dropEvent(event);
// query the indices of the dragged items again
QList<int> toRows;
foreach(item, dragItems) toRows.append(indexFromItem(item).row());
// notify subscribers in some useful way
emit itemsMoved(fromRows, toRows);
}
答案 2 :(得分:1)
OP实际上询问了如何获得有关内部移动的通知,即如何在不对QTreeWidget进行子类化的情况下执行此操作(至少我是如何使用内部移动因为它是内置的功能)。我刚刚找到了一种方法:连接到QTreeWidget模型的rowsInserted()信号!
connect(treeWidget->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));