Qt C ++ Удалить все виджеты в MainWindow - PullRequest
0 голосов
/ 12 ноября 2018

У меня в окне много виджетов, мне нужно удалить все из них, кроме QMenuBar.

ui->menuBar->addAction("Action!");

QWidget *widget = new QWidget(this);
widget->setObjectName("widget");
QVBoxLayout *layout = new QVBoxLayout(widget);
layout->addWidget(new QPushButton());
layout->addWidget(new QTableWidget(3, 4));`
//now i want to delete all i created 
QList<QWidget*> list = findChildren<QWidget*>();
for (int i = 0; i < list.size(); ++i)
    qDeleteAll(list[i]);

Но это не рабочая работа ...

1 Ответ

0 голосов
/ 13 ноября 2018

Если ваше главное окно наследует от QMainWindow, то вы можете просто сделать:

delete mainWnd->centralWidget(); 

... и все.

Но если вы унаследуете главное окно от QWidget и дочерние элементы находятся в макете, вам просто нужно просмотреть все элементы макета (не только виджеты, но все элементы макета) и удалить их.Взгляните на самый голосующий ответ, за исключением того, что вы, вероятно, не хотите удалять макет: Qt - удалить все виджеты из макета?

Короче:

if ( mainWnd->layout() != nullptr )
{
    QLayoutItem* item;
    while ( ( item = mainWnd->layout()->takeAt( 0 ) ) != nullptr )
    {
        delete item->widget();
        delete item;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...