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

0 ответов

Другие вопросы по тегам