Название: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 05, 2009, 18:38 Честно говоря, я не особо силён в MVC, так что вопрос на самом деле может оказаться крайне глупым. Поэтому заранее прощу прощения в случае чего. :)
Пытаюсь вывести в QTreeView самопальное дерево, но программа уверенно крэшится при попытке зайти в любую дочернюю ветку. Причём, если поймать его отладчиком, то окажется, что крэшится оно в недрах самой Qt на событии отрисовки в разных местах. В коде есть разного рода барахло, которое там только для того, чтобы "смоделировать" ситуацию максимально близко к реальным условиям. Судя по выводу в консоль, само дерево строится нормально. Код
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: Авварон от Октябрь 06, 2009, 10:01 мне не нравится
Код: QModelIndex parent(const QModelIndex &index) const { Название: Re: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 06, 2009, 19:00 Благодарю за ответ.
Нет, все эти граничные случаи с hasIndex и isValid я уже проверял - разницы никакой. Просто смущает то, что падает оно не на моём коде, а тот же valgrind выдаёт нереальную кучу различных ошибок. Некоторые совсем странные, вроде: Код: Conditional jump or move depends on uninitialised value(s) Название: Re: Модель на основе дерева. Странный крэш. Отправлено: Авварон от Октябрь 06, 2009, 19:42 чего странного? все правильно. читать надо снизу вверх - главный цикл запускает отрисовку, которая обращается к вьюхе, та к модели, а та уже зовет
at 0x804D94A: QList<Node*>::at(int) const (qlist.h:395) by 0x804D37C: IndexModel::index(int, int, QModelIndex const&) const (main.cpp:86) краш в ф-ии IndexModel::index(int, int, QModelIndex const&) const - скорее всего нод битый Название: Re: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 06, 2009, 20:05 Меня просто смутило именно описание про неинициализированную переменную. Перепроверил всё на ещё один раз и попробовал прогнать traverse без поднятия интерфейса - ни одной утечки. Выходит, что они бьются где-то во вьюхе. Если добавить к узлам деструкторы, то окажется, что они ни разу не вызываются, то есть никто никого не удаляет, хотя glibc иногда ругается на повторное освобождение блока памяти или ещё что-нибудь в этом духе.
Ах да, иногда под valgrind'ом выбрасывается assert о выходе за границы QList'а где-то в подсистеме отрисовки. Название: Re: Модель на основе дерева. Странный крэш. Отправлено: Авварон от Октябрь 06, 2009, 21:44 нашел там 3 ошибки, но так заставить работать до конца не смог:) крашится на 2м уровне вложенности
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 07, 2009, 08:12 Эх...ладно, спасибо. Пожалуй, отвлекусь от этого на пару деньков, чтобы потом уже свежим взглядом посмотреть на код. :)
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: KADABRA от Октябрь 07, 2009, 10:37 Во первых ещё при установке модели вылетает ассерт
Цитировать ASSERT failure in QAbstractItemView::setModel: "The parent of a top level index should be invalid", file itemviews\qabstractitemview.cpp, line 553 Неужели вы считаете что этот ассерт просто так вываливается и его можно игнорировать?Код
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 07, 2009, 12:19 Во первых ещё при установке модели вылетает ассерт А какая у Вас версия Qt, если не секрет? Просто у меня ни на ArchLinux'овой 4.5.3-2, ни на самосборной 4.6.0-tp1 этого ассерта нет, хотя последняя точно собрана в отладочном варианте.А вообще да, это всё проясняет, премного благодарен. :) Название: Re: Модель на основе дерева. Странный крэш. Отправлено: KADABRA от Октябрь 07, 2009, 12:37 А какая у Вас версия Qt, если не секрет? Не секрет конечно-же, 4.5.2 Win32 самосборная под msvs9.0 sp1.И врядли что в последующих версиях этот ассерт удалили. А если его нету, то это очень странно - может релиз сборка Qt? Название: Re: Модель на основе дерева. Странный крэш. Отправлено: uriel от Октябрь 07, 2009, 13:10 Так в том-то и дело, что 4.6.0-tp1 собирал сам с ключами -debug-and-release и -separate-debug-info. Всю жизнь при таком раскладе ассерты были, а на 4.6 куда-то пропали. Хотя, может тут и в чём-то другом дело.
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: yonas от Октябрь 08, 2009, 22:20 а корректно ли работает QModelIndex() ?
Название: Re: Модель на основе дерева. Странный крэш. Отправлено: Joss от Октябрь 08, 2009, 22:31 ИМХО, проще заглушки вставлять поэтапно, например:
Код: QVariant data(const QModelIndex &index, int role) const { на Код: QVariant data(const QModelIndex &index, int role) const { и т.д. Название: Re: Модель на основе дерева. Странный крэш. Отправлено: Авварон от Октябрь 08, 2009, 23:25 что значит корректно ли? обычно пустой индекс ассоциируется с рутом дерева (судя из QtDemo и того, что к примеру у меня все работает в таком его понимании)
|