在调用QWidget.setParent()的进程之后终止SIGSEGV
SIGSEGV on termination after procces called QWidget.setParent()
我尝试编写一个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体系结构,父部件将获得其子部件的所有权,并将在您终止应用程序时尝试销毁它。同时,你的Browser1
是FileDialog
类的成员变量,它也会试图在析构函数中销毁同一个对象。这就是问题的来源。
作为一个解决方案,我建议:
- 为Qt对象使用指针,
- 维护亲子关系,
- 使用布局来构建GUI
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- strncpy之后的char数组的错误行为
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 如何在向量中某个数字之后重新计算进程
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- read() 在 select() 阻塞之后,当从生成的进程从管道读取时
- MPI::COMM::Create之后的死锁(所有进程终止)
- 在调用QWidget.setParent()的进程之后终止SIGSEGV