QLayout動態佈局(清空佈局)

    新寫的程序需要動態的改變窗口數量,需要清理原有窗口。在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移除出佈局。如果被移除的窗口不需要使用,應當刪除。

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章