如何获得QTreeWidget内部项目移动的通知

How can I get notified of internal item moves inside a QTreeWidget?

本文关键字:移动 通知 项目 内部 何获得 QTreeWidget      更新时间:2023-10-16

我对QTreeWidget进行了子类化,将其dragDropMode设置为InternalMove,并用自定义项填充它,其中一些项可以拖动,另一些项接受拖放。用户可以按预期在树中移动项目。但我需要得到项目顺序变化的通知,并做出适当的反应。不幸的是,没有与树内项目移动相关的信号,我可以连接到

我尝试获取QTreeWidget的底层模型()的句柄,然后连接到它的rowsMoved信号,但它似乎不会在内部移动时发出。

我重新实现了QTreeWidget的dropEvent(),但无法确定那里的目标行索引。

显然,内部移动根本不会调用dropMimeData()事件。

我还能尝试其他方法吗?谢谢

在重新实现的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);
  ....
}

OP实际上询问了如何获得内部移动的通知,即如何在不对QTreeWidget进行子类的情况下进行通知(至少我是这样使用的,因为它是内置功能)。我刚刚找到了一种方法:连接到QTreeWidget模型的rowsInsered()信号!

connect(treeWidget->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));

顺便说一句,我找到了另一种方法来找出哪个元素确切地移动到了哪里,它避开了整个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);
}