【问题标题】:Should I need delete or after close?我应该需要删除还是关闭后?
【发布时间】:2016-06-09 12:31:16
【问题描述】:

我有一个带有“设置”按钮的表单(继承自 QMainWindow),需要显示设置表单(继承自 QWidget)。

按钮 click() 与一些 settingsButtonClick() 插槽相连

并在设置按钮点击:

void MainQT::settingsButtonClick()
{
    SettingsForm *settingsForm = new settingsForm();
    settingsForm->show();
}

它工作正常,但问题是我是否需要在某处删除此表单,或者当我关闭设置表单时它会被删除? 在这种情况下,我管理内存的正确方法是什么?我是否应该在 MainForm 的 ctor 隐藏中实例化设置表单并仅在请求时显示?

【问题讨论】:

  • 您需要手动delete。但是为什么首先要new呢?为什么不只是SettingsForm settingsForm; settingsform.show();
  • @BoBTFish 因为在您的情况下,表格将在显示后立即销毁。

标签: c++ forms qt user-interface widget


【解决方案1】:

我会这样做:

void MainQT::settingsButtonClick()
{
    SettingsForm *settingsForm = new settingsForm();
    settingsForm->setAttribute( Qt::WA_DeleteOnClose );
    settingsForm->show();
}

使用Qt::WA_DeleteOnClose 将确保settingsForm 在您关闭后被删除。 更多详情请查看Qt documentation

【讨论】:

    【解决方案2】:

    我应该在某处删除此表单还是在我关闭设置表单时将其删除?在这种情况下管理内存的正确方法是什么?我是否应该在 MainForm 的 ctor 隐藏中实例化设置表单并仅在请求时显示?

    对此没有严格的规定,您可以:

    • 每次需要显示时创建设置对话框,然后销毁对象;
    • 在 MainForm 构造函数中创建设置对话框,然后在用户操作时显示它;
    • 您甚至可以将设置对话框用作存储设置值的约束器

    请注意,您的代码会创建新对象并且永远不会破坏它,这会导致内存泄漏;考虑将指针保存为成员变量并在用户再次打开设置对话框时重新使用它:

    void MainQT::settingsButtonClick()
    {
        if(!mSettingsForm) mSettingsForm = new settingsForm();
        settingsForm->show();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-20
      • 2013-05-23
      • 2013-02-05
      • 2015-12-05
      • 2010-12-28
      • 2010-10-16
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多