Russian Qt Forum

Qt => Model-View (MV) => Тема начата: AlekseyK от Октябрь 05, 2010, 17:24



Название: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: 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() не помогает.


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 05, 2010, 17:36
И наоборот, если перехожу от большего количества строк к меньшему - QSortFilterProxyModel также показывает старое значение и в QTreeView вижу, например, 307 строк, а не 34, а заполнены только 34 естественно.


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 05, 2010, 18:36
Интересно, что если сразу после сигнала sourceModel()->modelReset() вызвать proxyModel->invalidate() или даже привязать (connect) этот сигнал к данному слоту вываливается ошибка (segmentation fault) на следующем месте в qabstractitemmodel.cpp:
Цитировать
Q_GLOBAL_STATIC(QEmptyItemModel, qEmptyModel)
т.е. QSortFilterProxyModel модель ещё пуста здесь. Как это лечить?!


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 06, 2010, 01:24
если сделать:
 
Код:
   emit layoutAboutToBeChanged();
    // изменение данных
    emit layoutChanged();
то всё равно ввалится с seg fault. Чего этим моделям нужно?! Чего я не понимаю? Ткните носом, пожалуйста.


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: voronElf от Октябрь 06, 2010, 07:07
ну из того кода, что показал, подход вроде верный. У меня работает такое. Давайте остальной код. Можт в обработке данных валится чтото ?

попробуй для прокси-модели выставить setDynamicSortFilter(true);


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



Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 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 таки серьёзные проблемы (http://bugreports.qt.nokia.com/secure/IssueNavigator.jspa?reset=true&&query=QSortFilterProxyModel&summary=true&description=true&type=1&pid=10510&component=19135)


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 08, 2010, 01:37
Отправил ребятам отчёт об ошибках: http://bugreports.qt.nokia.com/browse/QTBUG-14336
Надеюсь исправят.


Название: Re: Неверное значение rowCount() в QSortFilterProxyModel
Отправлено: AlekseyK от Октябрь 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();