Название: 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() разные паренты?
|