Qt5: перетащите поведение изменения действия между виджетами QTreeView
Я пишу приложения на C++ Qt 5.9.2 (Windows 7+) и у меня проблемы с пониманием поведения значков перетаскивания между виджетами в виде дерева или, возможно, это ошибка в qt.
Я создаю подкласс из QTreeView и QAbstractItemModel и перезаписываю supportDropActions () в моем классе пользовательской модели элементов, так что я могу установить их вручную, и я также устанавливаю defaultDropAction для своего представления дерева. Я инициализирую древовидное представление / модель следующим образом (предположим, модель древовидного представления уже установлена):
_guiTreeView.setDragEnabled(true);
_guiTreeView.setAcceptDrops(true);
_guiTreeView.setDragDropMode(QTreeView::DragDrop);
_guiTreeView.setDropIndicatorShown(true);
_guiTreeView.setDropActions(dropActions);
_guiTreeView.setDefaultDropAction(defaultDropAction);
Прежде всего: Что именно делают Shift, Ctrl и Alt Key во время или перед перетаскиванием? Я не мог найти что-то конкретное в документации, и, пытаясь, кажется, что:
- Shift = MoveAction
- Ctrl = CopyAction
- Alt = LinkAction (или переключение между поддерживаемыми действиями?) Также кажется, что клавиша Alt переключает значок перетаскивания на CopyAction, если по умолчанию используется другое значение.
У меня есть следующий пример приложения:
TreeView1 (TV1):
- supportDropActions: MoveAction | CopyAction
- defaultDropAction: CopyAction
TreeView2 (TV2):
- supportDropActions: MoveAction | CopyAction
- defaultDropAction: MoveAction
TreeView3 (TV3):
- supportDropActions: LinkAction | CopyAction
- defaultDropAction: LinkAction
Сценарий 1 (S1): перетащите элемент с TV1 на TV2
Здесь я ожидал, что при перетаскивании TV2 значок перетаскивания меняется с CopyAction (+) на MoveAction (->), поскольку defaultDropAction - MoveAction, но он остается как CopyAction. Это почему? Учитывается ли только перетаскивание по умолчанию из перетаскиваемого источника для значка перетаскивания при перетаскивании в другой виджет?
Сценарий 2 (S2): перетащите элемент с TV2 на TV3
Я ожидал, что здесь то же самое, что и в S1, но так как TV3 не поддерживает MoveAction, я ожидал получить LinkAction по умолчанию. Но давайте пока проигнорируем это. Если я сейчас наведу курсор мыши на элемент в TV3 и нажму Ctrl или Alt, ничего не произойдет. Почему это не переключается здесь на поддерживаемые действия TV3?? По крайней мере, CopyAction должен работать, так как TV2 также поддерживает это.
Я не хотел переопределять dragEnterEvent и dragMoveEvent для управления действиями и т. Д. Вручную (если это даже помогает), потому что тогда мне приходится самому кодировать множество вещей, которые уже предоставляет QAbstractItemView.
Заранее спасибо.
Я задал этот вопрос также на форуме qt: https://forum.qt.io/topic/83677/drag-action-change-behavior-between-tree-view-widgets