我的窗口上有很多小部件,我需要除去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]);
但这不是工作原理...
答案 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
)中,然后删除容器并创建一个新容器以在其中放置新的子代。