crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Странное поведение QTreeWidgetItem::removeChild
chereppiter
  опции профиля:
сообщение 18.12.2012, 10:56
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 12.11.2012
Пользователь №: 3595

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть функция построения дерева (QTreeWidget), в которой для каждого элемента верхнего уровня рекурсивно вызывается функция добавления отпрысков:

void addChilds(QTreeWidgetItem* item, int id)
{
QTreeWidgetItem* child;
for (unsigned int i = 0; i < nodes.size(); ++i)
{
if (nodes[i].parentid == id)
{
child = new QTreeWidgetItem(item);
child->setText(0, QString::fromUtf8(nodes[i].name.c_str()));
addChilds(child, nodes[i].id);
if (!child->childCount())
{
item->removeChild(child);
delete child;
}
}

}
}

По возвращению из рекурсивной addChilds, если у текущего чаилда детей нет, то он удаляется. Ситуация такая: на одной из итераций цикла к item был добавлен child (и не был удалён, т.к. у него тоже есть дети). На одной из последующих итераций создаётся child, для которого потом childCount оказывается 0, поэтому он удаляется (item->removeChild(child)). При этом почему-то вместе с этим отпрыском удаляется и тот, который был добавлен на одной из предыдущих итераций. Проблема решается исключением из вышеприведённого кода строчки:

item->removeChild(child);

Т.е. если удаление выглядит так:

if (!child->childCount())
{
delete child;
}

, то всё работает нормально.
Кто-нибудь знает причину этого загадочного явления?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 20.12.2012, 6:56
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


chereppiter, тогда прикрепи проект (удали лишнее), чтобы я смог повторить глюк у себя, тогда я смогу в отладчике точно посмотреть, что происходит.

Цитата(chereppiter @ 19.12.2012, 20:55) *
Не понимаю, в чём неправильность моего подхода к дереву. Строится оно вполне логично и правильно, если не использовать removeChild. Зачем мне дополнительная прослойка в виде stl-ного словаря, если мне это дерево нужно только для того, чтобы его отобразить в виджете и больше ни для чего?


1) неправильность подхода - не ООП , элементы дерева (виджета) раскиданы неизвестно где.
2) какая ещё прослойка ? Ты всё то же самое создаёшь. Только в мапе все указатели хранятся стройно и доступно
3) ошибка в том, что ты пытаешься одновременно отладить две вещи, при этом точно не знаю, какая из них не работает - то ли массив, то ли виджет. Я же предлагаю построить дерево без участия виджета (вещь остаётся одна), а потом уже разбираться с деревом-виджетом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- chereppiter   Странное поведение QTreeWidgetItem::removeChild   18.12.2012, 10:56
- - Алексей1153   в поставленном вопросе много неизвестного: 1) чем ...   18.12.2012, 23:54
- - chereppiter   1) Чтобы было более понятно, приведу полный текст ...   19.12.2012, 11:00
- - Алексей1153   chereppiter, что делает этот метод, можно прочитат...   19.12.2012, 14:37
- - chereppiter   Не понимаю, в чём неправильность моего подхода к д...   19.12.2012, 17:55
- - Алексей1153   chereppiter, тогда прикрепи проект (удали лишнее),...   20.12.2012, 6:56
- - chereppiter   Создал отдельный маленький тестовый проект. Глючна...   20.12.2012, 15:53
- - Алексей1153   в общем, вскрытие показало, что чукча умер от вскр...   21.12.2012, 0:25
- - iReset   Насколько я понял при беглом просмотре исходников,...   21.12.2012, 9:13
- - Алексей1153   iReset, вообще, забавная ситуация - указываем конк...   21.12.2012, 11:10
|- - iReset   Цитата(Алексей1153 @ 21.12.2012, 12:10) i...   21.12.2012, 12:30
- - chereppiter   Ну вот, совместными усилиями докопались до истины....   21.12.2012, 11:26


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 2:22