Как реализовать виджет перетаскивания в другой контейнер в qt?[закрыто]

StackOverflow https://stackoverflow.com//questions/20002566

  •  20-12-2019
  •  | 
  •  

Вопрос

У меня есть окно с несколькими контейнерами.Каков самый простой способ реализовать перетаскивание между ними?

Это было полезно?

Решение

Вы должны использовать QDrag* объект.Затем переопределите:

virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);

Внутри этого события вы будете управлять начальной точкой (где начинается перетаскивание) и конечной точкой (где вы опускаете виджет).Вы также будете использовать протокол MIME, чтобы позволить платформе управлять операцией перетаскивания.

Более полезная статья о перетаскивании: Перетащите

Другие советы

Думаю, проще всего было бы создать eventFilter класс, где вы можете фильтровать события перетаскивания и установить это (someWidget->installEventFilter) ко всем вашим виджетам, куда вы хотите перетащить.Пример из документов - здесь

обновлять:

Особенность фильтра событий в том, что вам не нужно создавать подклассы для всех ваших виджетов, чтобы их можно было перетаскивать.Просто установите фильтр на любой виджет, который вы хотите использовать, и он будет у него.

Что касается самого фильтра, он не всегда блокирует события и т. д. (он сделает это, если вы этого хотите).Это был просто пример того, как его можно использовать.

Всего лишь один из бесчисленных вариантов перетаскивания:в dropEvent, dragMoveEvent, dragEnterEvent ваш фильтр, возможно, запомнит указатель на то, что вы хотите удалить, а в dropEvent выдаст сигнал с объектом, это событие удерживает указатель и перехватит его с помощью виджета, куда вы его поместили, и все, любой виджет, который имеет Установленный фильтр будет иметь возможность перетаскивания.

Весь смысл фильтра событий заключается в том, чтобы НЕ беспокоиться о создании подклассов и подключении КАЖДОГО виджета, если у вас есть общий тип событий, который вы хотите перехватывать и обрабатывать аналогичным образом, например, события перетаскивания.

Я предполагал, что вы умеете перетаскивать, но подумал, что переопределять события во всех виджетах с одним и тем же кодом снова и снова может быть не так уж и правильно.Итак, я показал вам, как это можно легко сделать с помощью одного фильтра событий для всех виджетов, которые вы хотите перетаскивать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top