Russian Qt Forum

Qt => Model-View (MV) => Тема начата: slava_d200 от Июнь 10, 2012, 16:15



Название: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 10, 2012, 16:15
создал свою прокси модель на QSortFilterProxyModel

если некий модель данный на основании запроса.

необходимо произвести сортировку данных, то так к примеру чтобы первые 3 позиции из модели не сортировались а сортировались начиная с 4-ой записи.


прошу подсказки как что копать?


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: mutineer от Июнь 10, 2012, 16:24
http://doc.crossplatform.ru/qt/4.7.x/html-qt/qsortfilterproxymodel.html#lessThan

Переопредели и сортируй как хочешь


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 10, 2012, 16:44
сорри а можно подсказать как.

там же тока возвращается либо истина либо ложь.

а как сказать что "ты вот этот индекс не бери" и ничего с ним не делай?


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: mutineer от Июнь 10, 2012, 16:56
айтем с позицией 1 больше(меньше) всех остальных
айтем с позицией 2 больше(меньше) всех, кроме 1
айтем с позицией 3 больше(меньше) всех, кроме 1,2

остальные сравниваются по общим правилам


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: GreatSnake от Июнь 10, 2012, 16:57
Для того чтобы определённый элемент был в начале, для left возвращай true, а для right false.


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: Igors от Июнь 10, 2012, 17:12
айтем с позицией 1 больше(меньше) всех остальных
айтем с позицией 2 больше(меньше) всех, кроме 1
айтем с позицией 3 больше(меньше) всех, кроме 1,2
Не совсем
Код
C++ (Qt)
const int NUM_FIRST = 3;
bool MySortFilterProxyModel::lessThan ( const QModelIndex & left, const QModelIndex & right ) const
{
int lRow = qMin(left.row(), NUM_FIRST);
int rRow = qMin(right.row(), NUM_FIRST);
if (lRow < rRow) return true;
if (lRow > rRow) return false;
return QSortFilterProxyModel::lessThan(left, right);
}
 


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 10, 2012, 18:20
айтем с позицией 1 больше(меньше) всех остальных
айтем с позицией 2 больше(меньше) всех, кроме 1
айтем с позицией 3 больше(меньше) всех, кроме 1,2
Не совсем
Код
C++ (Qt)
const int NUM_FIRST = 3;
bool MySortFilterProxyModel::lessThan ( const QModelIndex & left, const QModelIndex & right ) const
{
int lRow = qMin(left.row(), NUM_FIRST);
int rRow = qMin(right.row(), NUM_FIRST);
if (lRow < rRow) return true;
if (lRow > rRow) return false;
return QSortFilterProxyModel::lessThan(left, right);
}
 

непонимаю.

отображаю модель в QTablView. добавил возможность сортировки по нажатию на название колонки.
повторил код.
никаких изменений не увидел.
при нажатии на название колонки. сортировка не изменилась, вернее сортируется так же как и без данного кода.


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: Igors от Июнь 10, 2012, 18:45
при нажатии на название колонки. сортировка не изменилась, вернее сортируется так же как и без данного кода.
Значит надо поставить breakpoint в отладчике и убедиться что добавленный код получает управление


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 10, 2012, 18:48
то то и оно что получает, но не сортирует.
понимаю что чудес не бывает - но факт


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: Igors от Июнь 11, 2012, 09:59
то то и оно что получает, но не сортирует.
понимаю что чудес не бывает - но факт
Выкладывайте минимальный проект, будем разбираться


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 12, 2012, 01:20
примет из теста , добавил стою модель.
при нажатии сортировки по колонке.
сортируется все , хотя в модели указано чтобы три первых строки не трогать.

может я чего не так делаю или хочу


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: Igors от Июнь 12, 2012, 03:09
примет из теста , добавил стою модель.
при нажатии сортировки по колонке.
сортируется все , хотя в модели указано чтобы три первых строки не трогать.

может я чего не так делаю или хочу
Полагаю "пример" и "свою" :) Ладно. возьмите оригинал (customfilterproxymodel пример) и вставьте текст в начало lessThan. Запустите пример и покликайте с одной колонки на другую - первые 3 строки "стоят"  (Petra, Rolf. Linda). Меняете порядок сортировки - строки убегают. Тогда так

Код
C++ (Qt)
bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
                                     const QModelIndex &right) const
{
   int lRow = qMin(left.row(), 3);
   int rRow = qMin(right.row(), 3);
 
if (sortOrder() == Qt::DescendingOrder) {
lRow = -lRow;
rRow = -rRow;
}
 
   if (lRow < rRow) return true;
   if (lRow > rRow) return false;
   return QSortFilterProxyModel::lessThan(left, right);
}
}
Ну а как Вы изнасиловали пример и где потеряли половину записей - то уже сами разбирайтесь


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 12, 2012, 11:13
а в этом примере который Вы сказали - все работает.
ладно буду разбираться почему у меня не работает.
СПАСИБО.


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 12, 2012, 12:28

Код
C++ (Qt)
bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
                                     const QModelIndex &right) const
{
   int lRow = qMin(left.row(), 3);
   int rRow = qMin(right.row(), 3);
 
if (sortOrder() == Qt::DescendingOrder) {
lRow = -lRow;
rRow = -rRow;
}
 
   if (lRow < rRow) return true;
   if (lRow > rRow) return false;
   return QSortFilterProxyModel::lessThan(left, right);
}
}
Ну а как Вы изнасиловали пример и где потеряли половину записей - то уже сами разбирайтесь

В общем получается следующее.
что если на модель наложен фильтр, то данный код не работает.


Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: Igors от Июнь 12, 2012, 13:05
В общем получается следующее.
что если на модель наложен фильтр, то данный код не работает.
Я спокойно отношусь к тому что мог ошибиться в коде - нет проблем. Но зачем говорить "не работает" если работает? Введите фильтр Petra|Rolf|Linda|Andy|Scott - первые 3 вверху. Напомню что Вы писали

необходимо произвести сортировку данных, то так к примеру чтобы первые 3 позиции из модели не сортировались а сортировались начиная с 4-ой записи.
Если все первые 3 отфильтрованы - ну никто и не будет всегда сверху 



Название: Re: QSortFilterProxyModel как правильно организовать сортироку
Отправлено: slava_d200 от Июнь 13, 2012, 19:02
Я прошу прощения, если Вас обидел - сорри. Я не хотел.
наоборот я Вам очень признателен за помощь.