![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
chereppiter |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 30 Регистрация: 12.11.2012 Пользователь №: 3595 Спасибо сказали: 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 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
в поставленном вопросе много неизвестного:
1) чем логически являются аргументы QTreeWidgetItem* item, int id - из их нзвания этого непонятно совершенно. Также название функции добавляет сумятицы (предположил бы я, что аргументы - это указатель на новый child и его id, но по названию функции это уже целая ветка. А id зачем - оно уже должно быть в теле item) 2) где и как описан объект nodes, что ты с ним делаешь раньше - ? 3) зачем добавлять дитёнка в дерево, чтобы узнать, что он пуст и потом удалить (ведь можно заранее проверить его на пустоту и сразу обойти) ? Я бы применил std::map для хранения структуры дерева, а также и указателей на созданные элементы. А сам контрол заполнял бы при необходимости, а потом полностью очищал (чтобы он сам не удалил элементы в деструкторе) |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 6:11 |