2013-12-16 5 views
3

Допустим, мы имеем следующую иерархию:своп QTreeView элементы на операцию перетаскивания

+ A 
|-- B 
    |-- D 
|-- C 

И скажем, пользователь перетаскивает C на В. Можно ли иметь оба узла (включая детей) поменялись местами, как результат этой операции перетаскивания?

+ A 
|-- C 
|-- B 
    |-- D 

Я пробовал несколько подходов: от не подклассов модели элемента (dropMimeData, insertRows и т.д.) в режимах настройки с setDragDropOverwriteMode и DragDropMode::InternalMove, чтобы подклассы dropEvent(QDropEvent * e) и ничего работали до сих пор.

я столкнулся следующие Techincal ограничения:

  • QStandardItemModel::dropMimeData и QTreeview::dropEvent не даст вам знать, индекс источника, они вперед мим данных, и нет никакого способа, чтобы получить QModelIndex Источника, чтобы выполнить обменивать.

  • Подход DragDropMode::InternalMove и setDragDropOverwriteMode не работает должным образом, исходный узел каким-то образом добавляется к целевому узлу-перехватчику, а исходный узел удален. Если вы установили DragDropMode::Copy, исходный узел будет сохранен, но целевой узел также не будет перезаписан.

Подсказка в правильном направлении будет оценена по достоинству.

ответ

4

Я проверил source code of Qt, и выясняется, что для извлечения индекса источника вы должны использовать текущий выбор. Поэтому переопределите QTreeview::dropEvent и выберите текущий выбор, позвонив по номеру selectedIndexes().


Обмен не является проблемой. Вы должны просто двигаться дважды.
Существует пространственный метод для этого: QAbstractItemModel::moveRow (в тройках у вас есть только один столбец, так что движущаяся строка в порядке). Здесь у вас есть ответ another solutions (для стандартной модели).

Если у вас есть собственная модель, вам необходимо сделать это прямо на ваших данных и просто испустить правильные сигналы о перемещении предметов.

+1

Это работает! Хотя он не отвечает на вопрос о том, как выполнять фактическую свопинг. Я пытаюсь использовать QStandardItemModel :: takeItem и такие, но 'QModelIndex's повреждаются при попытке выполнить обмен. Не говоря уже о том, как бороться с дочерними узлами. – voodooattack

+0

этот часть простой посмотрите обновление. –

+0

Это для Qt5. – voodooattack

Смежные вопросы