Russian Qt Forum

Qt => Model-View (MV) => Тема начата: vintik от Январь 24, 2013, 18:43



Название: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: vintik от Январь 24, 2013, 18:43
Всем привет!

Очень нуждаюсь в помощи сообщества!
Есть проблема при работе с моделью.

Исходные условия: есть QTreeView и 2 модели - стандартная и прокси.
Стандартная модель имеет несколько уровней вложенности.
Во вьюхе перманентно установлена прокси модель.

Проблема возникает в следующем случае. Сперва заполняется  стандартная модель. Затем устанавливаются условия фильтрации.
После этого из стандартной модели удаляются определённые айтемы. На этапе удаления прога крашится.
Ниже кусок кода.
Код:
    foreach(QStandardItem *item, list_item_)
    {
        QStandardItem *parent = item->parent();
        parent->removeRow(item->row());  // crush
    }

Причина мне абсолютно не понятна. Сломал голову, мозг, мышку, клавиатуру... всё сломал, но почему валится не понимаю

Сижу под Kubuntu 12.10 (64). Использую нативную для системы версию Qt 4.8.3

По ссылке можно качнуть пример проекта http://yadi.sk/d/uZk-Kfc025UUP (http://yadi.sk/d/uZk-Kfc025UUP). Если собрать в дебаге и запустить, свалится аккурат в указанном месте


Название: Re: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: Old от Январь 24, 2013, 20:14
Я правильно понимаю, что ты пытаешься удалить текущий элемент, на который указывает итератор?


Название: Re: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: vintik от Январь 24, 2013, 21:57
Да, всё верно! В списке хранятся валидные указатели на айтемы 2го уровня(сразу после верхнего). Их я и удаляю из дерева. После удаления указатели нет смысла хранить.. но тут я список не очищаю, поскольку пример искусственный.


Название: Re: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: Old от Январь 24, 2013, 23:32
А у меня твой тестовый пример не падает.

Цитировать
QMake version 2.01a
Using Qt version 4.8.4 in /usr/lib


Название: Re: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: vintik от Январь 25, 2013, 00:15
А у меня твой тестовый пример не падает.

Цитировать
QMake version 2.01a
Using Qt version 4.8.4 in /usr/lib

Это чертовски хорошая новость! Может это была кутешная бага и её пофиксили...


Название: Re: QSortFilterProxyModel + QStandardItemModel + QTreeView + crush when remove rows
Отправлено: vintik от Январь 25, 2013, 01:49
Дома сижу под арчем, вот только что обновил версию Qt до 4.8.4 - пример в приложенном к теме архиве заработал!
Видимо всё-таки кутешный баг был...
Кстати, до обновления версия была 4.8.2 - прога валилась в том же месте, что и при сборке с 4.8.3

Но если кто-нибудь всё-таки не поленится и найдёт в коде, где я был не прав (и был ли я неправ), то буду бесконечно благодарен