Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt C++;删除MainWindow上的所有小部件_C++_Qt_Widget - Fatal编程技术网

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

C++ Qt C++;删除MainWindow上的所有小部件,c++,qt,widget,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->a

我的窗口上有很多小部件,我需要删除除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]);
ui->menuBar->addAction(“Action!”);
QWidget*widget=新的QWidget(此);
widget->setObjectName(“widget”);
QVBoxLayout*布局=新的QVBoxLayout(小部件);
布局->添加小部件(新的QPushButton());
布局->添加小部件(新的QTableWidget(3,4))`
//现在我想删除我创建的所有内容
QList list=findChildren();
对于(int i=0;i

但它不起作用…

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

delete mainWnd->centralWidget(); 
。。。就这些

但是,如果您从
QWidget
继承了主窗口,并且子窗口位于布局中,则只需遍历布局中的所有项目(不仅是小部件,而且是所有布局项目)并删除它们。在此处查看投票率最高的答案,但您可能不想删除布局:

简言之:

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

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

请清除下一行:widget->setObjectName(“widget”);我相信,您只需要删除一个指针,在您的示例中是
widget
。其余的小部件将被自动删除,因为它们是“主”小部件的子部件。@vahancho是的,你是对的。但是,OP在清除其子项后可能仍希望使用
小部件
而(!list.isEmpty())list.takeFirst()->deleteLater()
即使正确使用了
qdeletall()
,代码也可能会崩溃。因为列表中填充了
findChildren()
,这是递归的。然后,如果尝试删除已删除父项的子项(这意味着该子项已与父项一起删除),则从列表中顺序删除项目可能会崩溃。双重删除将失败并可能崩溃。