Как включить как внутреннее переупорядочение, так и внешнее удаление в виджете 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);
}
Другие вопросы по тегам