Как реализовать виджет перетаскивания в другой контейнер в qt?[закрыто]
Вопрос
У меня есть окно с несколькими контейнерами.Каков самый простой способ реализовать перетаскивание между ними?
Решение
Вы должны использовать QDrag*
объект.Затем переопределите:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);
Внутри этого события вы будете управлять начальной точкой (где начинается перетаскивание) и конечной точкой (где вы опускаете виджет).Вы также будете использовать протокол MIME, чтобы позволить платформе управлять операцией перетаскивания.
Более полезная статья о перетаскивании: Перетащите
Другие советы
Думаю, проще всего было бы создать eventFilter
класс, где вы можете фильтровать события перетаскивания и установить это (someWidget->installEventFilter
) ко всем вашим виджетам, куда вы хотите перетащить.Пример из документов - здесь
обновлять:
Особенность фильтра событий в том, что вам не нужно создавать подклассы для всех ваших виджетов, чтобы их можно было перетаскивать.Просто установите фильтр на любой виджет, который вы хотите использовать, и он будет у него.
Что касается самого фильтра, он не всегда блокирует события и т. д. (он сделает это, если вы этого хотите).Это был просто пример того, как его можно использовать.
Всего лишь один из бесчисленных вариантов перетаскивания:в dropEvent, dragMoveEvent, dragEnterEvent ваш фильтр, возможно, запомнит указатель на то, что вы хотите удалить, а в dropEvent выдаст сигнал с объектом, это событие удерживает указатель и перехватит его с помощью виджета, куда вы его поместили, и все, любой виджет, который имеет Установленный фильтр будет иметь возможность перетаскивания.
Весь смысл фильтра событий заключается в том, чтобы НЕ беспокоиться о создании подклассов и подключении КАЖДОГО виджета, если у вас есть общий тип событий, который вы хотите перехватывать и обрабатывать аналогичным образом, например, события перетаскивания.
Я предполагал, что вы умеете перетаскивать, но подумал, что переопределять события во всех виджетах с одним и тем же кодом снова и снова может быть не так уж и правильно.Итак, я показал вам, как это можно легко сделать с помощью одного фильтра событий для всех виджетов, которые вы хотите перетаскивать.