Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Smogg от Март 13, 2015, 15:27



Название: QTreeView и сортировка по вложенным уровням
Отправлено: 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;
}

В прямой и обратной сортировке влезают какие-то пустые строчки:
(http://snorgg.ru/img/tree_asc.png) (http://snorgg.ru/img/tree_desc.png)

После нажатия на заголовок столбца функция 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___"

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



В чем прикол?


Название: Re: QTreeView и сортировка по вложенным уровням
Отправлено: Пантер от Март 13, 2015, 15:32
cnt = this->sourceModel()->rowCount(this->mapToSource(parent));

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


Название: Re: QTreeView и сортировка по вложенным уровням
Отправлено: Smogg от Март 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() разные паренты?