新写的程序需要动态的改变窗口数量,需要清理原有窗口。在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移除出布局。如果被移除的窗口不需要使用,应当删除。