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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSortFilterProxyModel как правильно организовать сортироку  (Прочитано 15017 раз)
slava_d200
Гость
« : Июнь 10, 2012, 16:15 »

создал свою прокси модель на QSortFilterProxyModel

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

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


прошу подсказки как что копать?
Записан
mutineer
Гость
« Ответ #1 : Июнь 10, 2012, 16:24 »

http://doc.crossplatform.ru/qt/4.7.x/html-qt/qsortfilterproxymodel.html#lessThan

Переопредели и сортируй как хочешь
Записан
slava_d200
Гость
« Ответ #2 : Июнь 10, 2012, 16:44 »

сорри а можно подсказать как.

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

а как сказать что "ты вот этот индекс не бери" и ничего с ним не делай?
Записан
mutineer
Гость
« Ответ #3 : Июнь 10, 2012, 16:56 »

айтем с позицией 1 больше(меньше) всех остальных
айтем с позицией 2 больше(меньше) всех, кроме 1
айтем с позицией 3 больше(меньше) всех, кроме 1,2

остальные сравниваются по общим правилам
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июнь 10, 2012, 16:57 »

Для того чтобы определённый элемент был в начале, для left возвращай true, а для right false.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 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);
}
 
Записан
slava_d200
Гость
« Ответ #6 : Июнь 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. добавил возможность сортировки по нажатию на название колонки.
повторил код.
никаких изменений не увидел.
при нажатии на название колонки. сортировка не изменилась, вернее сортируется так же как и без данного кода.
« Последнее редактирование: Июнь 10, 2012, 18:27 от slava_d200 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 10, 2012, 18:45 »

при нажатии на название колонки. сортировка не изменилась, вернее сортируется так же как и без данного кода.
Значит надо поставить breakpoint в отладчике и убедиться что добавленный код получает управление
Записан
slava_d200
Гость
« Ответ #8 : Июнь 10, 2012, 18:48 »

то то и оно что получает, но не сортирует.
понимаю что чудес не бывает - но факт
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 11, 2012, 09:59 »

то то и оно что получает, но не сортирует.
понимаю что чудес не бывает - но факт
Выкладывайте минимальный проект, будем разбираться
Записан
slava_d200
Гость
« Ответ #10 : Июнь 12, 2012, 01:20 »

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

может я чего не так делаю или хочу
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июнь 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);
}
}
Ну а как Вы изнасиловали пример и где потеряли половину записей - то уже сами разбирайтесь
Записан
slava_d200
Гость
« Ответ #12 : Июнь 12, 2012, 11:13 »

а в этом примере который Вы сказали - все работает.
ладно буду разбираться почему у меня не работает.
СПАСИБО.
Записан
slava_d200
Гость
« Ответ #13 : Июнь 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);
}
}
Ну а как Вы изнасиловали пример и где потеряли половину записей - то уже сами разбирайтесь

В общем получается следующее.
что если на модель наложен фильтр, то данный код не работает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 12, 2012, 13:05 »

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

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

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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