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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeView и сортировка по вложенным уровням  (Прочитано 2248 раз)
Smogg
Гость
« : Март 13, 2015, 15:27 »

Вот такой у меня код прокси модели. В принципе, он делает все то же самое, как и QSortFilterProxyModel по дефолту, лишь добавлен вывод для дебага в функции сортировки:
Код:
ModelTeamPrepareProxy::ModelTeamPrepareProxy(QObject *parent):
QSortFilterProxyModel(parent){}
ModelTeamPrepareProxy::~ModelTeamPrepareProxy(){}

bool ModelTeamPrepareProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const{

qd << " left < " << left.data(Qt::DisplayRole).toString();
qd << " right > " << right.data(Qt::DisplayRole).toString();

if (left.parent() != right.parent())
{
qd << "dif parents ";
qd << "          left < " << left.parent().data(Qt::DisplayRole).toString() << " - " <<left.parent();
qd << "          right > " << right.parent().data(Qt::DisplayRole).toString() << " - " << right.parent();
//return true;
}

if (left.data(Qt::DisplayRole).toString() <
right.data(Qt::DisplayRole).toString())
{
return true;
}

return false;
}

В прямой и обратной сортировке влезают какие-то пустые строчки:


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

Код:
"634 - mdlPrepare.cpp"  left <  "(3) Не ждали"
"635 - mdlPrepare.cpp"  right >  "(5) Команда Балаша Касумова"
"634 - mdlPrepare.cpp"  left <  "(5) Команда Балаша Касумова"
"635 - mdlPrepare.cpp"  right >  "(3) Не ждали"
"634 - mdlPrepare.cpp"  left <  "(0) Инфи Ёжики"
"635 - mdlPrepare.cpp"  right >  "(3) Не ждали"
"634 - mdlPrepare.cpp"  left <  "(3) Не ждали"
"635 - mdlPrepare.cpp"  right >  "(0) Инфи Ёжики"
"634 - mdlPrepare.cpp"  left <  "Geksogen"
"635 - mdlPrepare.cpp"  right >  "___DUST___"
"634 - mdlPrepare.cpp"  left <  "___DUST___"
"635 - mdlPrepare.cpp"  right >  "Geksogen"
"634 - mdlPrepare.cpp"  left <  "Brom GG"
"635 - mdlPrepare.cpp"  right >  "Geksogen"
"634 - mdlPrepare.cpp"  left <  "Geksogen"
"635 - mdlPrepare.cpp"  right >  "Brom GG"
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  "Brom GG"
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"641 - mdlPrepare.cpp"           right >  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"634 - mdlPrepare.cpp"  left <  "Brom GG"
"635 - mdlPrepare.cpp"  right >  ""
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"641 - mdlPrepare.cpp"           right >  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  ""
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  "___DUST___"
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"641 - mdlPrepare.cpp"           right >  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"634 - mdlPrepare.cpp"  left <  "___DUST___"
"635 - mdlPrepare.cpp"  right >  ""
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"641 - mdlPrepare.cpp"           right >  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  "Geksogen"
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"641 - mdlPrepare.cpp"           right >  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"634 - mdlPrepare.cpp"  left <  "Geksogen"
"635 - mdlPrepare.cpp"  right >  ""
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"641 - mdlPrepare.cpp"           right >  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  "Brom GG"
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"641 - mdlPrepare.cpp"           right >  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"634 - mdlPrepare.cpp"  left <  "Brom GG"
"635 - mdlPrepare.cpp"  right >  ""
"639 - mdlPrepare.cpp" dif parents
"640 - mdlPrepare.cpp"           left <  "(3) Не ждали"  -  QModelIndex(1,0,0x2fa4a0,ModelTeamPrepare(0x2fa388) )
"641 - mdlPrepare.cpp"           right >  ""  -  QModelIndex(-1,-1,0x0,QObject(0x0) )
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  ""
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  ""
"634 - mdlPrepare.cpp"  left <  ""
"635 - mdlPrepare.cpp"  right >  "___DUST___"

.... и так далее, длинно-длинно



В чем прикол?
« Последнее редактирование: Март 13, 2015, 15:43 от Smogg » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 13, 2015, 15:32 »

cnt = this->sourceModel()->rowCount(this->mapToSource(parent));

а если не маппить? Лень доку открывать, но в проксю падают корректные индексы, вроде.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Smogg
Гость
« Ответ #2 : Март 13, 2015, 15:49 »

cnt = this->sourceModel()->rowCount(this->mapToSource(parent));

а если не маппить? Лень доку открывать, но в проксю падают корректные индексы, вроде.

При обращении к модели-источнику обязательно надо маппить из прокси-индекса в источник-индекс)

ай, вот это совсем лишнее в данном примере:
Код:
int ModelTeamPrepareProxy::rowCount(const QModelIndex &parent ) const{
static int cnt;
cnt = this->sourceModel()->rowCount(this->mapToSource(parent));
return cnt;
}
Убрал.
Если принудительно перегружать rowCount(), то тогда количество строк получается правильным, но в обратной сортировке получается совсем пусто, потому что строчки с данными ниже максимальной показываемой строчки.

Вопрос в том, что как правильно обработать случай, когда у left и right-индексов в lessThan() разные паренты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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