2015-04-27 5 views
0

У меня есть QStackedLayout, который содержит несколько QWidget на нем. Макет виджетов QVBoxLayout, который также имеет несколько QPushButton. Я хотел бы удалить все виджеты внутри QStackedLayout, а затем удалить виджеты и макеты BUT Я хочу, чтобы все кнопки не удалялись, потому что я поместим их в другой виджет позже.QT5.4 удалить и удалить виджет в макете

Вот мой код:

while (QLayoutItem *item = m_stacked_layout->takeAt(0)) { 
    QWidget *w = item->widget(); 

    for (int i = 0; i < w->layout()->count(); i++) { 
     QPushButton *button = qobject_cast<QPushButton *>(w->layout()->itemAt(i)->widget()); 
     if (button) { 
      w->layout()->removeWidget(button); 
     } 
    } 

    delete w; 
    delete item; 
} 

сбой приложения на линии delete w;. И, если я удалю строки delete, приложение работает нормально.

+0

Документация для QLayoutItem предполагает, что QLayoutItem :: widget() больше выполняет функцию каста, чем возвращает член. Таким образом, вы не должны удалять виджет отдельно от элемента. –

+0

Виджет также удаляется при удалении QLayoutItem. – iSa

+0

Не получится. Когда вы добавляете виджет в макет, макет берет на себя ответственность за виджет. Удалите макет и удалите виджет. removeWidget не передает права собственности обратно. Поэтому ваши кнопки все равно удаляются. – Greenflow

ответ

1

НО Я хочу, чтобы все кнопки не удалялись, потому что я поместим их в еще один виджет позже.

  1. Скрыть все виджеты, которые вы хотите передать
  2. Установить родительский виджет для всех это виджеты для nullptr
  3. Позже ... установить необходимые вышестоящие и показать виджеты

Примечание: если вы хотите удалить виджеты внутри некоторых слотов, вы должны использовать метод deleteLater.

+0

Я заменяю 'delete w'' w-> deleteLater() 'и' w-> layout() -> removeWidget (button) 'с' button-> setParent (NULL) ', и теперь он отлично работает. Когда я прочитал о 'deleteLater', объект будет удален после выхода из цикла событий. Есть ли другой способ удалить виджет сразу? BTW, код выше был вызван в 'resizeEvent' – iSa

+0

Не когда цикл событий завершен. Но когда это продолжается. Вы можете прочитать Qt-документацию о 'deleteLater' +, когда и почему ее следует использовать. В большинстве случаев вы можете сразу же удалить виджеты с помощью оператора delete. –

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