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

时间:2013-07-17 20:05:32

标签: c++ qt notifications qtreewidget

我将一个QTreeWidget子类化,将其 dragDropMode 设置为 InternalMove 并使用自定义项填充它,其中一些可以被拖动,其他可以接受丢弃。用户可以按预期在树周围移动项目。但我需要通知项目顺序的变化并做出适当的反应。不幸的是,没有信号与我可以连接的树内物品的移动相关联。

我尝试获取QTreeWidget底层模型()的句柄,然后连接到其 rowsMo​​ved 信号,但在内部移动期间似乎没有发出。

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

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

我可以尝试其他任何方法吗?感谢。

3 个答案:

答案 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)));