新寫的程序需要動態的改變窗口數量,需要清理原有窗口。在windows下寫好代碼後放入linux下崩潰。查看Qt文檔才發現是寫法不規範的問題。
先直接擺最終寫法:
QLayoutItem *item = mainLayout->takeAt(0);
while(item != 0)
{
if(item->widget())
{
mainLayout->removeItem(item);//A
delete item;
}
item = mainLayout->takeAt(0);
}
以下是幾次錯誤嘗試(直接從A處寫):
1、最早是從網上找到的資料,先隱藏窗口,再刪除。
{
item->widget()->setVisible(false);
delete item->widget();
}繞過佈局直接刪除widget,windows下不會出錯,但Linux會崩潰
2、查看Qt文檔後,使用removeWidget
{
mainLayout->removeWidget(item->widget());
delete item->widget();
printf("after remove widget item value %d\n",item);
}利用removeWidget移除窗口後刪除不會報錯,但打印後發現item地址還是不變的,說明item還是在的。雖然不清楚qt內部機制,但還是處理乾淨好一些。
tips:Qt文檔中removeItem和removeWidget都有一段話:
It is the caller's responsibility to delete the item.
可見removeItem和removeWidget僅僅將widget/item移除出佈局。如果被移除的窗口不需要使用,應當刪除。