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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неверное значение rowCount() в QSortFilterProxyModel  (Прочитано 6584 раз)
AlekseyK
Гость
« : Октябрь 05, 2010, 17:24 »

Почему-то rowCount() выдаёт меньшее количество строк, чем есть в sourceModel()->rowCount(). Фильтрации нет, только сортировка. sourceModel - это QAbstractTableModel. Проблема в следующем:
Загружаю данные в sourceModel получаю, например, 34 строки. Затем полностью меняю данные в sourceModel:
Код
   beginResetModel();
   // ... total data change
   endResetModel();
 
sourceModel()->rowCount() выдаёт 307, а QSortFilterProxyModel::rowCount() по прежнему 34. В чём проблема? Как сказать QSortFilterProxyModel - обновить данные? invalidate() не помогает.
Записан
AlekseyK
Гость
« Ответ #1 : Октябрь 05, 2010, 17:36 »

И наоборот, если перехожу от большего количества строк к меньшему - QSortFilterProxyModel также показывает старое значение и в QTreeView вижу, например, 307 строк, а не 34, а заполнены только 34 естественно.
Записан
AlekseyK
Гость
« Ответ #2 : Октябрь 05, 2010, 18:36 »

Интересно, что если сразу после сигнала sourceModel()->modelReset() вызвать proxyModel->invalidate() или даже привязать (connect) этот сигнал к данному слоту вываливается ошибка (segmentation fault) на следующем месте в qabstractitemmodel.cpp:
Цитировать
Q_GLOBAL_STATIC(QEmptyItemModel, qEmptyModel)
т.е. QSortFilterProxyModel модель ещё пуста здесь. Как это лечить?!
Записан
AlekseyK
Гость
« Ответ #3 : Октябрь 06, 2010, 01:24 »

если сделать:
 
Код:
   emit layoutAboutToBeChanged();
    // изменение данных
    emit layoutChanged();
то всё равно ввалится с seg fault. Чего этим моделям нужно?! Чего я не понимаю? Ткните носом, пожалуйста.
Записан
voronElf
Гость
« Ответ #4 : Октябрь 06, 2010, 07:07 »

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

попробуй для прокси-модели выставить setDynamicSortFilter(true);
« Последнее редактирование: Октябрь 06, 2010, 07:08 от voronElf » Записан
AlekseyK
Гость
« Ответ #5 : Октябрь 06, 2010, 11:49 »

Выставил первым делом - не работает. Код даю, не жалко - LGPL Подмигивающий Модели находятся в cfilebrowsermodel.cpp и cfilebrowsermodel.h. Данные в модели QAbstractTableModel меняются в методах populateFilesAndDirectories() и populateDrives(). Потом пытаюсь сказать QSortFilterProxyModel, что данные изменились. Но reset() не работает, а на остальном оно всё время падает: будь то invalidate(), emit layoutChanged() или ещё что-нибудь. В методе void CFileBrowserSortModel::reset() просто дебуггером смотрю, что данные (rowCount) в QSortFilterProxyModel не меняются. В результате получается кошмар: можно запустить и посмотреть какой ужас выдаёт QTreeView при смене директории.

Записан
AlekseyK
Гость
« Ответ #6 : Октябрь 06, 2010, 17:24 »

Поставил setDynamicSortFilter(false), стало немного получше, но rowCount в QSortFilterProxyModel всё равно неправильный и TreeView выводит кучу пустых строк.

Аналогичные проблемы у людей:
http://www.prog.org.ru/topic_12450_0.html
http://www.prog.org.ru/topic_13265_0.html
http://www.prog.org.ru/topic_11715_0.html
http://www.prog.org.ru/topic_9392_0.html
http://www.prog.org.ru/topic_6653_0.html
http://www.prog.org.ru/topic_10178_0.html

Похоже, что тролли никак не допилят QSortFilterProxyModel: может поломали layoutAboutToBeChanged/layoutChanged/invalidate. Видимо нужно будет при случае отчёт об ошибке отправить в Qt.

Наверное реализую сортировку в самой исходной модели переопределив sort, да и быстрее будет.

P.S. И похоже, что у них с этим QSortFilterProxyModel таки серьёзные проблемы
« Последнее редактирование: Октябрь 06, 2010, 17:44 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #7 : Октябрь 08, 2010, 01:37 »

Отправил ребятам отчёт об ошибках: http://bugreports.qt.nokia.com/browse/QTBUG-14336
Надеюсь исправят.
Записан
AlekseyK
Гость
« Ответ #8 : Октябрь 15, 2010, 18:23 »

Блин, таки мой бок: http://bugreports.qt.nokia.com/browse/QTBUG-14336?focusedCommentId=129703&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_129703

Код
C++ (Qt)
bool CFileBrowserSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
    QVariant leftData = sourceModel()->data(left);
    QVariant rightData = sourceModel()->data(right);
 
    // Always put upper directory to the top for both orders types
-    QString leftFileName = sourceModel()->data(index(left.row(), 0)).toString();
-    QString rightFileName = sourceModel()->data(index(right.row(), 0)).toString();
+    QString leftFileName = sourceModel()->data(sourceModel()->index(left.row(), 0)).toString();
+    QString rightFileName = sourceModel()->data(sourceModel()->index(right.row(), 0)).toString();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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