【发布时间】:2016-10-04 17:00:54
【问题描述】:
我们的一位老师要求我们为主窗口(QMainWindow)创建一个没有任何 UI 文件的 Qt 应用程序。通常我总是创建一个,将其留空并让 uic 处理它。
我知道如果一个小部件(子)和它的父级之间定义了父级关系,那么就不需要删除这个小部件(删除父级时删除)。因此,当 UI 被删除时,所有子项都将被销毁。
如果我们不使用 UI 文件(未生成),我们是否必须手动删除所有添加到 GUI 的小部件?
一个小样本:
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent){
layout = new QHBoxLayout(this);
aButton = new QButton(this);
layout->addWidget(aButton);
...
}
MainWindow::~MainWindow(){
delete ui; // No need to delete more if parental relation.
// However, what do we do if no ui has been generated?
// Do we have to delete aButton?
}
parent的值为0,是应用程序的主入口。
谢谢
【问题讨论】:
-
实际上不清楚你在问什么,但假设
ui是nullptrdelete ui;是NOP。所以看起来还不错。 -
我们必须手动删除每个小部件吗? 不需要。小部件应该是父小部件的子小部件。当父对象被删除时,QObject 会处理它们。
-
它应该有一个父 QObject(或者在堆栈上或者被手动删除......)否则 MainWindow 本身就会泄漏。
-
.ui 文件不会做任何神奇的事情,它们会转换为您可以自己编写的 C++ 代码(至少理论上如此)。请检查生成的简单 UI 的 ui_XXX.h 以获得一些见解。
-
另一件让你的生活更轻松的事情:addWidget、setLayout 等重置父级,所以你不需要在创建时将 this 作为构造函数参数小部件、布局等