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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Drag'n'drop из дочернего виджета  (Прочитано 12000 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #15 : Октябрь 01, 2018, 12:18 »

Авварон, dragDropMode не особо помог. Зато рядышком у view есть свойство dragDropOverwriteMode - так вот, для list view, если его выставить в false, removeRows() начинает отрабатывать! Т.е. для списка работают и Copy, и Move.

Теперь делаю аналогичный пример для table view. Всё отличие в том, что виджеты не QListView, а QTableView, и у модели в дополнение к rowCount() переопределил ещё и columnCount(). Начинаю таскать. CopyAction по-прежнему работает, а с MoveAction проблема та же, что и раньше, т.е. removeRows() не вызывается.

Уже начинаю перечитывать доку и придираться к словам:
Цитировать
For example, to allow Qt::MoveAction to be used properly with a list model, the model must provide an implementation of QAbstractItemModel::removeRows(), either directly or by inheriting the implementation from its base class.

Может, этот приём только с list model и работает? А как же тогда с table view разруливать? Руками посылать сигнал в модель виджета-источника, чтобы она сама удаляла нужную строку? Да нет, чепуха какая-то, чем таблицы хуже списков...
Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #16 : Октябрь 02, 2018, 16:45 »

Нашёл Улыбающийся
В дополнение к dragDropOverwriteMode==false, для таблиц должно выполняться одно из двух условий:
  • количество столбцов равно 1;
  • selectionBehaviour у view выставлен в SelectRows.
Если хотя бы одно из условий выполняется, removeRows() вызывается корректно. Если ни одно не выполняется - не вызывается.
В принципе, всё оказалось просто и логично. Улыбающийся Если мы выделяем отдельные ячейки, тогда непонятно, что удалять. Но пока разбирался, чуть не поседел...
« Последнее редактирование: Октябрь 02, 2018, 16:49 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #17 : Декабрь 22, 2018, 16:30 »

Впрочем, совет Igors навесить фильтр тоже не пропал втуне. Хотя применять его буквально действительно не стоило.

Дело в том, что кроме "местного" драг-н-дропа строк между табличками в моей программе есть ещё и "внешний" - из файлового менеджера можно перетащить имя на панельку (в моём случае, на QTableView), и программа его открывает.

Панелек у меня одна или две. И в предыдущей реализации я перекрыл dropEvent() у главного окна... и долго ломал голову, как правильно определять, на какую именно панельку кинут URL. Сделал через определение координат события и сравнение с координатами дочерних виджетов. Способ очевидно некрасивый, и мог поломаться, если, например, мне захочется вместо горизонтального расположения панелек сделать вертикальное.

А после этого обсуждения я переписал код. Установил фильтр на события для обоих QTableView, и в фильтре просто смотрю, кто получатель. Получилось намного изящнее. Улыбающийся
« Последнее редактирование: Декабрь 22, 2018, 16:34 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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