[英]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.