Как я могу получить уведомление о перемещении внутренних элементов внутри QTreeWidget?

Я подкласс QTreeWidget, установите его dragDropMode в InternalMove и наполняет его пользовательскими предметами, некоторые из которых можно перетаскивать, другие принимают капли. Пользователь может перемещать элементы вокруг дерева, как и ожидалось. Но я должен быть уведомлен об изменении в порядке пунктов и реагировать соответствующим образом. К сожалению, нет никаких сигналов, связанных с перемещением элементов внутри дерева, к которым я мог бы подключиться.

Я попытался получить дескриптор к основному QTreeWidget модель (), затем подключиться к его rowsMoved сигнал, но он, кажется, не излучается во время внутренних движений.

Я переопределил QTreeWidget dropEvent (), но нет никакого способа определить индекс строки назначения там.

dropMimeData () событие не вызывается вообще для внутренних ходов, по-видимому.

Любой другой подход, который я мог бы попробовать? Благодарю.

4

Решение

В переопределенной 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);
....
}
6

Другие решения

Между прочим, я нашел другой способ узнать, какой именно элемент перемещен, а какой обходит весь 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);
}
1

ОП на самом деле спросил, как получить уведомление о внутренний ход, вот как это сделать без подкласса QTreeWidget (по крайней мере, так я использую внутренний ход так как это встроенный функционал). Я только что нашел способ сделать это: подключиться к модели QTreeWidget rowsInserted () сигнал!

connect(treeWidget->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));
1
По вопросам рекламы [email protected]