Странное поведение QTreeWidgetItem::removeChild |
Здравствуйте, гость ( Вход | Регистрация )
Странное поведение QTreeWidgetItem::removeChild |
chereppiter |
18.12.2012, 10:56
Сообщение
#1
|
Студент Группа: Участник Сообщений: 30 Регистрация: 12.11.2012 Пользователь №: 3595 Спасибо сказали: 0 раз(а) Репутация: 0 |
Есть функция построения дерева (QTreeWidget), в которой для каждого элемента верхнего уровня рекурсивно вызывается функция добавления отпрысков:
void addChilds(QTreeWidgetItem* item, int id) По возвращению из рекурсивной addChilds, если у текущего чаилда детей нет, то он удаляется. Ситуация такая: на одной из итераций цикла к item был добавлен child (и не был удалён, т.к. у него тоже есть дети). На одной из последующих итераций создаётся child, для которого потом childCount оказывается 0, поэтому он удаляется (item->removeChild(child)). При этом почему-то вместе с этим отпрыском удаляется и тот, который был добавлен на одной из предыдущих итераций. Проблема решается исключением из вышеприведённого кода строчки: item->removeChild(child); Т.е. если удаление выглядит так: if (!child->childCount()) { delete child;} , то всё работает нормально. Кто-нибудь знает причину этого загадочного явления? |
|
|
Алексей1153 |
21.12.2012, 0:25
Сообщение
#2
|
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
в общем, вскрытие показало, что
При этом вызов деструктора чайлда (с помощью delete) приводит к правильному удалению правильного элемента контейнера дерева (чайлд знает родителя, поэтому тут всё корректно у них завязано) дигноз:не пользоваться removeChild на скрине три этапа: до вызова removeChild , затем до вызова delete, и после вызова. Видно, что при вызове removeChild - чайлд (0xac77f30) затёр собой нулевой элемент После вызова delete он пропал и сам При моём подходе, кстати, вызов removeChild не нужен Сообщение отредактировал Алексей1153 - 21.12.2012, 0:31 |
|
|
||
Текстовая версия | Сейчас: 25.11.2024, 8:39 |