Перетаскивание QTreeWidget для изменения порядка выбирает неправильный элемент

Выполнив приведенные здесь рекомендации: QTreeWidget переупорядочивает дочерние элементы путем перетаскивания, перетаскиваемый элемент не выбран.

Итак, вполне естественно, я попытался получить перетаскиваемый элемент, а затем вызвать для него 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, который был удален?


person Simon    schedule 29.01.2014    source источник
comment
Не могли бы вы показать код, где вы производите выбор?   -  person vahancho    schedule 29.01.2014


Ответы (1)


Поскольку выпавший элемент может «упасть» выше или ниже целевого элемента, вам необходимо управлять обеими ситуациями и вычислять правильный индекс перемещенного элемента. Например:

[..]
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);
}
person vahancho    schedule 29.01.2014