用于重新排序的QTreeWidget拖放选择了错误的项目

时间:2014-01-29 14:24:56

标签: qt drag-and-drop qtreewidget

按照此处提供的建议:QTreeWidget reordering child items by dragging后,未选中拖动的项目。

所以,很自然地,我试图获取被拖动的项目,然后在其上调用setSelected()。

结果是选择了正确开启前的项目。

我将QTreeWidget子类化为覆盖dropEvent,如下所示 -

QTreeWidgetItem *pItem;
QModelIndex dropIndex = indexAt(pEvent->pos());

if(dropIndex.isValid() == false)
{
    pEvent->setDropAction(Qt::IgnoreAction);
    pEvent->accept();
    return;
}

pItem = this->itemAt(pEvent->pos());
QTreeWidget::dropEvent(pEvent);

如何获取指向已删除的正确QTreeWidgetItem的指针?

1 个答案:

答案 0 :(得分:2)

由于被删除的项目可以“落在”目标项目的上方或下方,因此您需要管理这两种情况并计算移动项目的正确索引。例如:

[..]
virtual void dropEvent(QDropEvent * event)
{
    QModelIndex droppedIndex = indexAt( event->pos() );
    if( !droppedIndex.isValid() )
        return;

    QTreeWidget::dropEvent(event);

    DropIndicatorPosition dp = dropIndicatorPosition();
    if (dp == QAbstractItemView::BelowItem) {
        droppedIndex = droppedIndex.sibling(droppedIndex.row() + 1, // adjust the row number
                                            droppedIndex.column());
    }
    selectionModel()->select(droppedIndex, QItemSelectionModel::Select);
}