【问题标题】:Qt C++ Remove all widgets on MainWindowQt C++ 删除 MainWindow 上的所有小部件
【发布时间】:2018-11-12 11:23:36
【问题描述】:

我的窗口上有很多小部件,我需要删除除 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]);

但这不是workink...

【问题讨论】:

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

标签: c++ qt widget


【解决方案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,带有一些无边距布局),然后删除容器并创建一个新容器以将新子容器放入其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多