Russian Qt Forum
Ноябрь 23, 2024, 04:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Драг и дроп элементов  (Прочитано 5868 раз)
phpCoder
Гость
« : Март 14, 2015, 10:34 »

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 14, 2015, 11:51 »

почитай про drag and drop в документации, там все расписано
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
phpCoder
Гость
« Ответ #2 : Март 14, 2015, 12:41 »

Информативный ответ.
Поэтому спрашиваю здесь конкретно. Если есть что-то по делу, пишите. Ничего нет - не пишите.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 14, 2015, 12:58 »

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

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

Расскажите чего хотите добиться, "в лоб" здесь не проходит
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Март 14, 2015, 13:21 »

https://github.com/kambala-decapitator/QTblEditor/blob/master/d2stringtablewidget.cpp#L128 пример реализации дропивента (правда это для таблицы, но суть та же)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 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 сбросился, это не запрещено
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Март 14, 2015, 13:58 »

при использовании *Widget вроде гарантии есть (не уверен).

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 14, 2015, 14:30 »

при использовании *Widget вроде гарантии есть (не уверен).

а как выделение может само по себе сброситься?
Неважно "как", ведь события разрешены, случиться может все что угодно. По идеологии DnD данные драга могут быть приняты даже после того как источник удален. Поэтому корректно юзать ту миму что идет с событием, остальное "костыль" (як каже молодь Улыбающийся).
Записан
phpCoder
Гость
« Ответ #8 : Март 14, 2015, 14:57 »

Расскажите чего хотите добиться, "в лоб" здесь не проходит
Все очень просто: на QListWidget падают элементы, взятые из другого QListWidget (который у меня известен). Эти элементы содержат только название (то, которое видно на экране). Нужно эти названия собрать и далее произвести некоторые действия, которые теперь уже к самому ДНД не относятся. 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 15, 2015, 10:47 »

Все очень просто: на QListWidget падают элементы, взятые из другого QListWidget (который у меня известен). Эти элементы содержат только название (то, которое видно на экране). Нужно эти названия собрать и далее произвести некоторые действия, которые теперь уже к самому ДНД не относятся. 
Ну тогда простое и практичное решение (пусть не 100% академическое) что использовал kambala - приводите event->source() к известному QListWidget и извлекаете его selection. Лучше это делать в фильтре что навесите на QListWidget-приемник (или его viewport).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.