【问题标题】:SegFault while trying to use non-null pointer to QGridLayout (Qt)尝试使用指向 QGridLayout (Qt) 的非空指针时出现 SegFault
【发布时间】: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() 确保在安全的情况下删除对象。

标签: c++ qt


【解决方案1】:

您的代码不完整,但不断删除和重新创建布局没有多大意义。

您对布局的“清除”不正确。你想要:

void clearLayout(QLayout * layout) {
    while (layout->count() > 0) delete layout->takeAt(0);
}

【讨论】:

    【解决方案2】:

    我打赌currentGrid 已被删除。

    不管怎样,delete mainLayout; 不喜欢我。在后面加上mainLayout = 0;...

    【讨论】:

    • - 从 currentGrid 填充 prevList
    • 当然,不涉及完整代码是不可能知道的。但是 - 相信我 - SIGSEGV 意味着您删除了 pointed 对象...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多