在调用QWidget.setParent()的进程之后终止SIGSEGV

SIGSEGV on termination after procces called QWidget.setParent()

本文关键字:进程 之后 终止 SIGSEGV 调用 QWidget setParent      更新时间:2023-10-16

我尝试编写一个qt小部件,用于在打开文件时弹出对话框。我目前走了这么远:

class FileDialog : public QWidget
{
    Q_OBJECT
protected:
    QLineEdit Browser1;
public:
    QWidget Dialog;
    FileDialog();
    ~FileDialog();
};

FileDialog::FileDialog()
{
    Dialog.setFixedSize(600, 250);
    Browser1.setParent(&Dialog); // SIGSEGV comes since I have added this line. Uncommenting fixes it.
    return;
}
FileDialog::~FileDialog()
{
    return;
}

但是,当我试图将路径的文本字段添加到小部件中时,一切都按预期工作,直到我终止应用程序,之后(如果我处于调试模式)程序接收SIGSEGV。当我再次注释它时,我不再得到任何错误。

那么我忘记了什么,当添加一个小部件作为另一个小部件的子部件时必须提醒什么?

当您添加一个小部件作为另一个小部件的子部件时,根据Qt体系结构,父部件将获得其子部件的所有权,并将在您终止应用程序时尝试销毁它。同时,你的Browser1FileDialog类的成员变量,它也会试图在析构函数中销毁同一个对象。这就是问题的来源。

作为一个解决方案,我建议:

  • 为Qt对象使用指针,
  • 维护亲子关系,
  • 使用布局来构建GUI