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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: drag и drop в наследнике QSortFilterProxyModel  (Прочитано 4146 раз)
neosapient
Гость
« : Сентябрь 30, 2015, 01:40 »

Здравствуйте.

Надо перетаскивать строчки в таблице.
По условиям задачи делаю таблицу, в которой надо таскать строчки. Таблица состоит из прокси модели и QTableView.
Прокси модель сделал как наследник  QSortFilterProxyModel и переопределил в ней функцию сортировки. Так же сохраняю "веса" строчек в структуре  типа QMap<>, в случае если их перетаскивал пользователь.
В прокси модели переопределяю метод dropMimeData(..., int row, int column, ...).

Проблема: Во время запуска программы, когда перетаскиваю строчку по таблице, то строка удаляется из базовой модели.
Почему? И как исправить?

P.S.
Задание выглядит несколько сложнее.
Есть QStandardItemModel - в ней основные данные. Так же в ней можно ставить галочки.
Далее идет моя прокси модель, которая показывает отфильтрованные строчки. Т.е. есть 1000 строчек в базовой модели, но только напротив 10 стоят галочки. Вот эти 10 строчек надо показывать в отдельной таблице и позволять пользователю перетасовывать строчки между собой.

Как я понял, при перетаскивании строк
- для старого положения строки вызывается removeRows() автоматически,
- внутри dropMimeData() надо вызывать insertRows() вручную.
Проблема в том, что мне надо менять положение строки, а не удалять её из базовой модели.

Казалось бы, мне надо переопределить removeRows(), но тогда как я узнаю кто и из-за чего вызвал removeRows()? Ведь
- если это перетаскивание строки, то надо менять индекс (ок, пусть даже удалить старую строчку и вставить её, но только из прокси модели, не из базовой модели)
- а если это в базовой модели сняли галочку, то должен отработать фильтр, который удаляет строчку только из прокси модели.

Если знаете готовый пример, пожалуйста, приведите его.
Спасибо.

----
Уже думаю, что надо делать свою прокси модель.
« Последнее редактирование: Сентябрь 30, 2015, 01:48 от neosapient » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Сентябрь 30, 2015, 06:38 »

Имел схожие проблемы (без сортировки). См тему "Перетаскивание строк в таблице"
Записан
neosapient
Гость
« Ответ #2 : Сентябрь 30, 2015, 12:06 »

Здравствуйте, Igors.

По форуму темы с подобным именем не нашел.
В интернете нашел рабочий пример, но только с базовой моделью (без прокси модели). Нашел ещё вчера, задолго до написания вопроса.

Как я понимаю, текущая проблема с наследником от QSortFilterProxyModel зависит от неправильной отработки removeRows() применительно к моей ситуации. Т.е. вместо того, чтобы удалить строчку в прокси-модели, удаляется строчка из базовой модели.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 30, 2015, 12:12 »

По форуму темы с подобным именем не нашел.
Виноват, "перетасовка строк в таблице", вот она. В 2 словах - мучился, плюнул и написал велик
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #4 : Январь 20, 2016, 13:59 »

Здравствуйте.

Необходимо перетаскивать строки в таблице, отсортированной по алфавиту, по второму столбцу (см. рисунок).

В данный момент строка вставляется по очень плохо понятному мне принципу.

Тест делаю такой: после запуска для сотртровки нажимаю на заголовок "Переменная", после этого перетаскиваю строку (непонятно мне ведет себя, если 4 строку перетаскиваю на 3, 7->9, и тд)

Как сделать, чтобы при сортировке строка перемещалась над той, на которую опускаю?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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