Как включить как внутреннее переупорядочение, так и внешнее удаление в виджете Qt?
Я создал виджет, который наследует QListWidget
,
Моя цель - принять файлы, добавленные в него из внешнего файлового менеджера, и дать пользователю возможность изменить порядок элементов в виджете. Я могу достичь и того и другого, но не одновременно.
Если бы я просто установить
myWidget->setDragDropMode(QListView::InternalMove);
myWidget->setDragEnabled(true);
Я могу изменить порядок элементов в виджете, но не могу добавить в него внешние элементы.
Если я переопределить dragMoveEvent
, dragEnterEvent
а также dropEvent
события, все они просто имеют acceptProposedAction();
и некоторые отладочные сообщения внутри них, я могу перетаскивать внешние файлы в свой виджет, но я больше не могу переставлять элементы.
Есть ли способ иметь два вышеупомянутых элемента одновременно или мне нужно самостоятельно управлять элементами в переопределенных функциях? Если так, как я могу узнать, является ли удаленный элемент внутренним или внешним, и как я могу узнать, с какой позиции он был взят и на какую позицию в списке он был удален?
Если я проанализирую mimeData, полученную из события, я смогу увидеть, является ли он файлом или текстом, и я получу "qabstractitemmodeldatalist", если это был внутренний элемент, но он все равно не дает мне свою позицию.
Я могу проверить event->pos()
знать в пикселях, где было сделано падение, и event->source()
чтобы узнать о том, что там было пропущено, но действительно ли это лучший способ начать вычислять значения пикселей и добавлять объекты "вручную"?
1 ответ
Решение было очень простым: мне просто нужно было вызывать функции родительского класса в конце каждой переопределенной функции.
void myWidget::dropEvent(QDropEvent *event)
{
do_stuff_with_received_data(event);
QListWidget::dropEvent(event);
}