2011-11-21 2 views
1

У меня есть главное окно, где я создаю объекты динамически, поэтому перед тем, как создавать новый экран, я должен сначала удалить все объекты с последнего экрана. Я использовал это, и это работает прекрасно:Как удалить всех детей окна Qt?

qDeleteAll(this->window->findChildren<QWidget*>()); 

Но теперь у меня есть этот экран, который имеет некоторые QGraphicsView и QGraphicsScene, и я сделал их родитель главного окна, а также, и теперь я получил аварию, когда я попробуйте удалить все дети главного окна.

Так что мой вопрос в основном, как я могу избежать этой аварии? Как я могу легко и безопасно удалить всех детей моего главного окна, включая GraphicsScene и GraphicsView?

ответ

5

Я подозреваю, что ваш сбой вызван двойным удалением.

Родительские/дочерние отношения QObject делают это так, что если родительский элемент удален, его дети также удаляются. Поэтому, если вы хотите удалить виджет и все его потомки, вам нужно только удалить родителя.

В вашем случае я, вероятно, удостоверился, что все динамически созданные виджеты принадлежат к виду виджетов/фреймов контейнера и удаляют их, а затем их воссоздают.

+0

Вы имеете в виду «потомки»? Не уверен, что Qt-виджеты даже нужно удалить. Они подсчитываются, поэтому, если вы повторно используете один или несколько, есть небольшая стоимость, чтобы держать их вокруг. – casualcoder

+2

QObjects удалит своих детей при удалении, но в систему QObject нет счетчика ссылок. Программисту все равно, чтобы обеспечить правильное управление памятью, это просто упрощает работу. – Chris

+0

Это отлично работает, я просто создал QWidget, который я использую как родительский для всех объектов, и сделал главное окно родителем этого нового QWidget, а затем просто удалю его, чтобы удалить все объекты. Можете ли вы, ребята, больше поговорить об этой проблеме с памятью? Должен ли я что-то сделать, чтобы гарантировать, что у меня не будет нехватки памяти? Моя программа работает во встроенных системах, поэтому управление памятью очень важно! Спасибо. –

Смежные вопросы