Russian Qt Forum

Qt => Model-View (MV) => Тема начата: neosapient от Сентябрь 30, 2015, 01:40



Название: drag и drop в наследнике QSortFilterProxyModel
Отправлено: neosapient от Сентябрь 30, 2015, 01:40
Здравствуйте.

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

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

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

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

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

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

----
Уже думаю, что надо делать свою прокси модель.


Название: Re: drag и drop в наследнике QSortFilterProxyModel
Отправлено: Igors от Сентябрь 30, 2015, 06:38
Имел схожие проблемы (без сортировки). См тему "Перетаскивание строк в таблице"


Название: Re: drag и drop в наследнике QSortFilterProxyModel
Отправлено: neosapient от Сентябрь 30, 2015, 12:06
Здравствуйте, Igors.

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

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


Название: Re: drag и drop в наследнике QSortFilterProxyModel
Отправлено: Igors от Сентябрь 30, 2015, 12:12
По форуму темы с подобным именем не нашел.
Виноват, "перетасовка строк в таблице", вот она (http://www.prog.org.ru/index.php?topic=29013.msg212713#msg212713). В 2 словах - мучился, плюнул и написал велик


Название: Re: drag и drop в наследнике QSortFilterProxyModel
Отправлено: YvenTitan от Январь 20, 2016, 13:59
Здравствуйте.

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

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

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

Как сделать, чтобы при сортировке строка перемещалась над той, на которую опускаю?