【发布时间】:2013-09-05 15:21:12
【问题描述】:
我正在尝试编写一个布局管理器,它能够显示所有添加的小部件、过滤它们或调整其中一些小部件的大小。我有一个 QWidget 子类,它具有小部件的 currentList、所有小部件的列表、上次更改之前显示的小部件的 prevList。 它还有一个 currentGrid(QGridLayout*) 可以相应地显示小部件,而 mainLayout 可以保存网格和一些按钮。
如果发生变化,我会调用 updateLayout 函数,其摘要如下: - 从 currentGrid 填充 prevList - 清除和删除 mainLayout - 清除 currentGrid - 从 currentList 填充 currentGrid - 创建新的主布局 - 添加按钮 - 添加当前网格
当我只添加 1 个小部件时,它工作得很好。当我尝试添加第二个时,它给出了一个段错误。
这是我清除 mainLayout 的方法
if(mainLayout) //clear mainLayout
{
while(mainLayout->count() > 0)
mainLayout->takeAt(0);
delete mainLayout;
}
这是这段代码的下一行,发生段错误的位置由 (-->) 显示。
if(currentGrid)
{
-->while(currentGrid->count() > 0)
{
currentGrid->takeAt(0);
}
}
【问题讨论】:
-
不要用 delete 删除 QObjects。使用 deleteLater()。
-
你能告诉我有什么区别吗?
-
Qt-docs:当控制返回事件循环时,对象将被删除。 QObjects 可以有一个“秘密”的生命。无论是由于信号/插槽,还是由于事件。例如,在您的情况下,您从布局中删除一个项目,布局内容会重新排列。可能会发布一个事件,因此 gui 的其他部分可能会相应地采取行动……但突然间,发件人被删除了。 deleteLater() 确保在安全的情况下删除对象。