簡體   English   中英

"Qt - 從 QWidget 的布局中清除所有小部件"

[英]Qt - Clear all widgets from inside a QWidget's layout

我在對話框中有一個QWidget<\/code> 。 在程序運行的過程中,幾個QCheckBox *<\/code>對象被添加到布局中,如下所示:

QCheckBox *c = new QCheckBox("Checkbox text");
ui->myWidget->layout()->addWidget(c);

你可以試試這個:

    while ( QLayoutItem* item = ui->myWidget->layout()->takeAt( 0 ) )
    {
        Q_ASSERT( ! item->layout() ); // otherwise the layout will leak
        delete item->widget();
        delete item;
    }

布局的精彩之處在於它們可以自動處理窗口小部件的刪除。 所以你真正需要的是迭代小部件,你就完成了。 由於您要清除給定窗口小部件的所有子項,只需執行以下操作:

for (auto widget: ui->myWidget::findChildren<QWidget*>
                                            ({}, Qt::FindDirectChildrenOnly))
  delete widget;

根本不需要擔心布局。 這適用於孩子是否由布局管理。

如果你想要真正正確,你需要忽略作為子窗口小部件但是獨立窗口的窗口小部件。 如果這是在通用庫代碼中就是這種情況:

for (auto widget: ui->myWidget::findChildren<QWidget*>
                                            ({}, Qt::FindDirectChildrenOnly)) 
  if (! widget->windowFlags() & Qt::Window) delete widget;

或者,如果您只想刪除由給定布局及其子布局管理的子項:

void clearWidgets(QLayout * layout) {
   if (! layout)
      return;
   while (auto item = layout->takeAt(0)) {
      delete item->widget();
      clearWidgets(item->layout());
   }
}

鑒於您有一個由包含小部件的級聯布局組成的小部件層次結構,那么您最好采用以下方法。

第1步:刪除所有小部件

    QList< QWidget* > children;
    do
    {
       children = MYTOPWIDGET->findChildren< QWidget* >();
       if ( children.count() == 0 )
           break;
       delete children.at( 0 );
    }
    while ( true );

第2步:刪除所有布局

    if ( MYTOPWIDGET->layout() )
    {
        QLayoutItem* p_item;
        while ( ( p_item = MYTOPWIDGET->layout()->takeAt( 0 ) ) != nullptr )
            delete p_item;
        delete MYTOPWIDGET->layout();
    }

在第2步之后,你的MYTOPWIDGET應該是干凈的。

PySide2 解決方案:<\/strong>

from PySide2 import QtWidgets


def clearLayout(layout: QtWidgets.QLayout):
    for i in reversed(range(layout.count())):
        item = layout.itemAt(i)
        if isinstance(item, QtWidgets.QLayout):
            clearLayout(item)
        elif item.widget():
            item.widget().setParent(None)
        else:
            layout.removeItem(item)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM