Qt - удалить все виджеты из макета? - PullRequest
55 голосов
/ 25 ноября 2010

Это не кажется легким.По сути, я добавляю QPushButtons через функцию к макету, и когда функция выполняется, я хочу сначала очистить макет (удалив все QPushButtons и все остальное, что там есть), потому что больше кнопок просто добавляются в представление прокрутки.

header

QVBoxLayout* _layout;

cpp

void MainWindow::removeButtonsThenAddMore(const QString &item) {

//remove buttons/widgets

QVBoxLayout* _layout = new QVBoxLayout(this);

QPushButton button = new QPushButton(item);
_layout->addWidget(button);

QPushButton button = new QPushButton("button");
_layout->addWidget(button);

QWidget* widget = new QWidget();
widget->setLayout(_layout);

QScrollArea* scroll = new QScrollArea();
scroll->setWidget(widget);
scroll->show();

}

Ответы [ 12 ]

0 голосов
/ 11 октября 2013

Если вы не делаете ничего смешного, когда добавляете виджеты к макетам и макеты к другим макетам, все они должны быть переписаны после добавления в родительский виджет.Все объекты QObject имеют слот deleteLater(), который приведет к удалению объекта, как только управление вернется в цикл обработки событий.Виджеты, удаленные в этой усадьбе, также удаляют их детей.Поэтому вам просто нужно вызвать deleteLater () для самого высокого элемента в дереве.

в hpp

QScrollArea * Scroll;

в cpp

void ClearAndLoad(){
    Scroll->widget()->deleteLater();
    auto newLayout = new QVBoxLayout;
    //add buttons to new layout
    auto widget = new QWidget;
    widget->setLayout(newLayout);
    Scroll->setWidget(widget);
}

также обратите внимание, что в вашем примере _layout - это локальная переменная, а не то же самое, что _layout в заголовочном файле (удалить часть QVBoxLayout*).Также обратите внимание, что имена, начинающиеся с _, зарезервированы для разработчиков стандартной библиотекиЯ использую завершающий _ как в var_, чтобы показать локальную переменную, есть много вкусов, но предшествующие _ и __ технически зарезервированы.

0 голосов
/ 25 ноября 2010

Если вы хотите удалить все виджеты, вы можете сделать что-то вроде этого:

foreach (QObject *object, _layout->children()) {
  QWidget *widget = qobject_cast<QWidget*>(object);
  if (widget) {
    delete widget;
  }
}
...