Russian Qt Forum

Qt => Model-View (MV) => Тема начата: phpCoder от Март 14, 2015, 10:34



Название: Драг и дроп элементов
Отправлено: phpCoder от Март 14, 2015, 10:34
Добрый день.
1. Есть QListWidget, на который мышью перетягивают совокупность элементов из другого QListWidget.
Вопрос: как отловить это событие/сигнал и получить список элементов, которые упали на виджет?

2. Теперь наоборот - с QListWidget мышью перетягивают элементы.
Вопрос: как отловить это событие/сигнал и получить список элементов, которые перетянули с виджета?


Название: Re: Драг и дроп элементов
Отправлено: kambala от Март 14, 2015, 11:51
почитай про drag and drop в документации, там все расписано


Название: Re: Драг и дроп элементов
Отправлено: phpCoder от Март 14, 2015, 12:41
Информативный ответ.
Поэтому спрашиваю здесь конкретно. Если есть что-то по делу, пишите. Ничего нет - не пишите.


Название: Re: Драг и дроп элементов
Отправлено: Igors от Март 14, 2015, 12:58
Добрый день.
1. Есть QListWidget, на который мышью перетягивают совокупность элементов из другого QListWidget.
Вопрос: как отловить это событие/сигнал и получить список элементов, которые упали на виджет?

2. Теперь наоборот - с QListWidget мышью перетягивают элементы.
Вопрос: как отловить это событие/сигнал и получить список элементов, которые перетянули с виджета?
Первый - упали, т.е. произошел drop, а второй - что ловить-то? В любом случае затея неудачна. В стандартной реализации в момент дропа никаких айтемов нет, есть QMimeData где эти айтемы записаны в QByteArray. Оттуда они читаются и сразу вставляются (см исходники методов dropMimeData). В свое время  я не нашел возможности перехватить, поэтому сделал свой startDrag (запускаю DnD сам) и в mime кладу данные в своем формате (напр только QModelndex). А на приемнике перекрыл dropMimeData и в своем формате получаю.

Расскажите чего хотите добиться, "в лоб" здесь не проходит


Название: Re: Драг и дроп элементов
Отправлено: kambala от Март 14, 2015, 13:21
https://github.com/kambala-decapitator/QTblEditor/blob/master/d2stringtablewidget.cpp#L128 пример реализации дропивента (правда это для таблицы, но суть та же)


Название: Re: Драг и дроп элементов
Отправлено: Igors от Март 14, 2015, 13:41
https://github.com/kambala-decapitator/QTblEditor/blob/master/d2stringtablewidget.cpp#L128 пример реализации дропивента (правда это для таблицы, но суть та же)
Оттуда
Код
C++ (Qt)
void D2StringTableWidget::dropEvent(QDropEvent *event)
{
....
QTableWidgetSelectionRange range = qobject_cast<QTableWidget *>(event->source())->selectedRanges().at(0);
Т.е. предполагаем что тип источника наш (известен) и берем его selection. Конечно "так защищаться можно", но все-таки нет гарантий что это те самые айтемы что хранятся в mime. Напр пока драгали - selection сбросился, это не запрещено


Название: Re: Драг и дроп элементов
Отправлено: kambala от Март 14, 2015, 13:58
при использовании *Widget вроде гарантии есть (не уверен).

а как выделение может само по себе сброситься?


Название: Re: Драг и дроп элементов
Отправлено: Igors от Март 14, 2015, 14:30
при использовании *Widget вроде гарантии есть (не уверен).

а как выделение может само по себе сброситься?
Неважно "как", ведь события разрешены, случиться может все что угодно. По идеологии DnD данные драга могут быть приняты даже после того как источник удален. Поэтому корректно юзать ту миму что идет с событием, остальное "костыль" (як каже молодь :)).


Название: Re: Драг и дроп элементов
Отправлено: phpCoder от Март 14, 2015, 14:57
Расскажите чего хотите добиться, "в лоб" здесь не проходит
Все очень просто: на QListWidget падают элементы, взятые из другого QListWidget (который у меня известен). Эти элементы содержат только название (то, которое видно на экране). Нужно эти названия собрать и далее произвести некоторые действия, которые теперь уже к самому ДНД не относятся. 


Название: Re: Драг и дроп элементов
Отправлено: Igors от Март 15, 2015, 10:47
Все очень просто: на QListWidget падают элементы, взятые из другого QListWidget (который у меня известен). Эти элементы содержат только название (то, которое видно на экране). Нужно эти названия собрать и далее произвести некоторые действия, которые теперь уже к самому ДНД не относятся. 
Ну тогда простое и практичное решение (пусть не 100% академическое) что использовал kambala - приводите event->source() к известному QListWidget и извлекаете его selection. Лучше это делать в фильтре что навесите на QListWidget-приемник (или его viewport).