Qt C ++删除MainWindow上的所有小部件

时间:2018-11-12 11:23:36

标签: c++ qt widget

我的窗口上有很多小部件,我需要除去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 :(得分:1)

如果您的主窗口继承自QMainWindow,则可以执行以下操作:

delete mainWnd->centralWidget(); 

...仅此而已。

但是,如果您从QWidget继承主窗口,而子窗口处于布局中,则只需要遍历布局中的所有项目(不仅是小部件,还包括所有布局项目)并将其删除。在这里看看投票最多的答案,除了您可能不想删除布局:Qt - remove all widgets from layout?

简而言之:

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

但是,无论如何,如果您要动态重复地添加和删除某些小部件,最好将它们放在已知的容器(具有某些无边距布局的普通QWidget)中,然后删除容器并创建一个新容器以在其中放置新的子代。