gpt4 book ai didi

c++ - 为什么这个 QT 应用程序以 SIGABRT 信号退出?

转载 作者:太空狗 更新时间:2023-10-29 23:41:59 32 4
gpt4 key购买 nike

我是 Qt 新手。所以我开始重新实现入门示例之一:link .

但是我在关闭窗口时收到 SIGABRT 信号。原因显然是由于某些内存管理错误。

您可以在下面找到调用堆栈和相关代码。 editWindow.setLayout(&layout); 行导致错误。布局类是否在销毁时删除小部件,从而声明对它们的所有权?

这种行为的原因是什么?以及如何解决?

最好的问候。

信息
调用堆栈
callstack

来源

  QPushButton testButton("Test");

QVBoxLayout layout;
layout.addWidget(&testButton);

QWidget editWindow;
// the following line is the source of the error
editWindow.setLayout(&layout);
editWindow.show();

int val = app.exec();

最佳答案

许多不同的 Qt 函数将获得传入对象的所有权,这意味着它控制所有内存管理并在删除时释放它。来自setLayout文档:

The QWidget will take ownership of layout.

在您调用 setLayout 之后,它有一个父级,它的父级除了在清理方法的堆栈时将其删除外,还将其删除。因此,它被删除了两次,这导致了问题。

如果其他所有内容都正确,则此更改应该可以修复它:

QVBoxLayout *layout = new QVBoxLayout();
//...
layout->addWidget(&testButton);
//...
editWindow.setLayout(layout);

另请注意,通常创建主窗口小部件,然后分配将显示在该窗口小部件上的窗口小部件作为父窗口小部件。换句话说,我期待更像下面的东西(虽然不是绝对必要的)。这也有助于确保如果将来某些东西确实得到了重新定义,你不会有问题:

QWidget editWindow;
QVBoxLayout *layout = new QVBoxLayout();
QPushButton *testButton = new QPushButton(&editWindow);
layout->addWidget(testButton);
editWindow.setLayout(layout);
editWindow.show();
int val = app.exec();

大多数重新设置父级且所有权可能发生更改的 Qt 对象将具有接受 QWidget*QObject* 的构造函数。

关于c++ - 为什么这个 QT 应用程序以 SIGABRT 信号退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696664/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com