我的
mainwindow.cpp
中有这个(最小示例)代码:
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent) {
setWindowTitle("Drawing Window");
setFixedSize(800, 600);
auto *layout = new QVBoxLayout(this);
auto *hlayout = new QHBoxLayout();
// Create the Button
button = new QPushButton("Load Image", this);
button->setGeometry(10, 10, 80, 30);
// Create the drawing area
drawingArea = new QLabel(this);
drawingArea->setFixedSize(512, 512);
hlayout->addStretch(1);
layout->addWidget(button);
hlayout->addWidget(drawingArea);
hlayout->addStretch(1);
layout->addLayout(hlayout);
layout->addStretch(1);
}
main.cpp
:
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
据我了解,由于父子关系,Qt 应该自行处理布局的内存。
但是:CLion 在以下行中显示警告
Allocated memory is leaked
:
auto *layout = new QVBoxLayout(this);
auto *hlayout = new QHBoxLayout();
使用 Valgrind 运行此代码,我收到以下警告:
Leak_DefinetlyLost - 2 Warnings
Leak_PossiblyLost - 136 Warnings
UninitCondition - 209 Warnings
我的代码有问题吗?我应该在析构函数中删除我的布局吗?为什么? Qt 不帮我处理这个吗?
根据 Nate 爵士的建议,我们可以发现在您的示例中
layout
没有父级。
这里的问题是
QMainWindow 对象带有自己的自定义布局,在实际主窗口上设置布局,或创建以主窗口作为父窗口的布局,都被视为错误。您应该始终在中央小部件上设置自己的布局。
如Qt 官方菜单示例中名为“MainWindow 类实现”的部分所述。
因此,当您使用
QVBoxLayout
参数创建 this
时,它会失败。
为了实现正确的内存管理,您应该为主窗口创建并设置一个中央小部件,然后将
layout
添加到其中。您还可以在上面的链接中找到代码示例。