Название: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Мая 31, 2011, 11:39 Возможно не в том разделе но все же.
Существует компановшик, на который кладутся еще компановщики, и в них так же кладутся компановшики, и так далее сколько угодно. Задача в один момент удалить все компановшщики до уровня базового: Пытаюсь сделать это следующим образом: 1. Функция для удаления виджетов из компановщика Код: void OTS_MainWindow::DeleteAllWidgets(QLayout *layout) 2. Функция для удаления компоновщика и виджетов лежащих на нем Код: void OTS_MainWindow::DeleteAllLayouts(QLayout *layout) Проблема в том что последняя функция рушит программу, причем рушит только тогда когда пытается удалить компоновщики, если же их нет то функция отрабатывает обсалютно нормально. то есть до else все происходит хорошо. Не совсем понятно где может быть проблема так как логика вполне прозрачна мне кажется. Собственно в этом и вопрос. Заранее спасибо за помощь и терпение. Название: Re: Удаление объектов. Рекурсия Отправлено: kambala от Мая 31, 2011, 11:46 в DeleteAllWidgets() наверное правильно будет так:
Код
Название: Re: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Мая 31, 2011, 11:51 Ну собственно здесь не принципиально) Хотя по логике конечно правильнее. Но собственно проблемы это так или иначе не решит к сожалению((
Название: Re: Удаление объектов. Рекурсия Отправлено: Igors от Мая 31, 2011, 12:15 По смыслу это вручную делаться не должно - просто создать виджет на верхнем/нужном уровне (который будет парентом всего хозяйства) - и его когда надо просто delete
Название: Re: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Мая 31, 2011, 15:59 привязывать к парент не всегда удобно... а функция для удаления нужна((
Название: Re: Удаление объектов. Рекурсия Отправлено: GreatSnake от Мая 31, 2011, 16:19 привязывать к парент не всегда удобно... а функция для удаления нужна(( Тебе может и неудобно, только Qt это сделает в любом случае.Т.е. достаточно удалить либо сам лейаут либо его элементы ( qDeleteAll( QObjectList( layout()->children() ) ). Название: Re: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Мая 31, 2011, 16:32 В том то и дело что если удалить компановщик виджеты останутся лежать. По крайней мере в это теме http://www.prog.org.ru/topic_10935_0.html было так. ДА и сам я тоже на это натыкался.
Вы только не подумайте что я сомневаюсь в ваших словах. Уже проверять пытаюсь ваш способ)) К сожалению ваш метод не удалил виджеты. Хотя лайоуты были удалены все. По крайней мере дебаг показал так qDeleteAll(QObjectList(layout->children())); qDebug()<<layout->count(); вывод:0. получается что виджеты потом непонятно куда падают, потому что метод DeleteAllWidgets(layout)ж в данном случае убрать их не может... (сам метод рабочий 100% потому что его я использовал в других моментах удачно.) Название: Re: Удаление объектов. Рекурсия Отправлено: GreatSnake от Мая 31, 2011, 17:01 Сорри, беру свои слова обратно.
Чего-то перемудрил :( Цитировать получается что виджеты потом непонятно куда падают, потому что метод DeleteAllWidgets(layout)ж в данном случае убрать их не может... Виджеты становятся потомками виджета, на котором был лейаут и удалять уже нужно детей этого виджета.Вот работающий пример: Код
Т.е. моё утверждение насчёт Цитировать Тебе может и неудобно, только Qt это сделает в любом случае. верно.Название: Re: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Июня 01, 2011, 15:49 Спасибо за пример!)
но у меня к сожалению при удалении таким образом происходит крах: и так qDeleteAll(TabWidget->currentWidget()->children()); и так qDeleteAll(QObjectList(TabWidget->currentWidget()->children())); Вот с таким списком сообщений: warning: can't find linker symbol for virtual table for `QMetaObject::._19' value warning: can't find linker symbol for virtual table for `QMetaObject::._19' value warning: can't find linker symbol for virtual table for `QMetaObject::._87' value warning: found `typeinfo for QEventLoop' instead warning: can't find linker symbol for virtual table for `QMetaObject::._19' value warning: can't find linker symbol for virtual table for `QMetaObject::._19' value warning: found `typeinfo for QWhatsThat' instead warning: can't find linker symbol for virtual table for `QMetaObject::<anonymous struct>' value warning: found `typeinfo for QDialog' instead Название: Re: Удаление объектов. Рекурсия Отправлено: Ovoshlook от Июня 02, 2011, 17:09 Всем спасибо за советы. проблему решил следующим образом:
Удалил основной виджет на котором все лежит. Только в моем случае получилось что из пушки по воробъям потому, что пришлось удалять аж целый Tab и потом его заново пересоздавать для того чтобы создать виджет лежащий на табе. Правда сначала я попробывал немного подругому сделать: Структура таба была изначально такая Tabwidget->Layout(основной компоновщик для виджета)->itemAt(компоновщики, которые я накидывал на основной, в них так же были еще компоновщики и виджеты которые мне нужно было удалить) У меня получалось удалить все компоновщики до Tabwidget->Layout, но при этом виджеты не удалялись. Тогда я решил сделать вот что: На основной компановщик я клал еще один виджет: Tabwidget->Layout-Widget На него лепил основной компоновщик Tabwidget->Layout-Widget-Layout И потом уже клал то что мне нужно Tabwidget->Layout-Widget-Layout-ItemAt(i) Только либо путь был слишком большой либо где то промахнулся но при таком раскладе прога вылетала с крахом. Так как время поджимает пришлось стрелять из пушки по воробьям. Название: Re: Удаление объектов. Рекурсия Отправлено: GreatSnake от Июня 02, 2011, 17:46 Ну не знаю что там у тебя делается, но вот это работает:
Код
|