这是我调用的MainWindow
类,并使用函数show()
使其对用户可见。
class MainWindow : public QMainWindow
{
Q_OBJECT
QWidget *centralWidget;
QGridLayout* gridLayout;
QGridLayout* infoBoxLayout;
QHBoxLayout* buttonGroup;
QHBoxLayout* subCategoryLayout;
//... more widgets
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void setupUi();
void setupConnections();
private slots:
void add();
void edit();
void remove();
void find();
void clearAll();
void screenshotDesktop();
void screenshotApp();
void currentSubCategoryChanged( const QString& );
void curretCategoryChanged( const int );
void keyPressEvent( QKeyEvent * );
};
我为每个窗口小部件(宏Q_OBJECT
之后的那些指针)创建了一个带有new
的堆上的新对象。但是,我没有在程序中的任何地方删除它们。这会导致Qt内存泄漏吗?或者Qt中的某些东西在销毁类时会自动删除它们吗?
答案 0 :(得分:11)
如果窗口小部件具有父集,则Qt将处理删除窗口小部件。 对于MainWindow,当您关闭它时,MainWindow及其子节点将被清理,因此将父节点传递给小部件的构造函数: -
QHBoxLayout* buttonGroup = new QHBoxLayout(this); // where this is the parent (MainWindow)
如果你创建一个这样的小部件: -
QHBoxLayout* buttonGroup = new QHBoxLayout;
并没有通过父母,然后它将不会被清理,你将不得不自己处理。
答案 1 :(得分:5)
如果您将它们添加到gui层次结构中,那么当MainWindow
被删除时它们将被清除
这是因为父母对子女拥有所有权(使用gui的各种添加设置)
因此this->add(centralWidget);
会调用centralWidget->setParent(this);
,centralWidget
会在删除MainWindow
时删除deleteLater()
你可以自己删除QObjects,但要注意悬空指针(QPointer会在这里提供帮助)。虽然我建议使用{{1}}来确保当指针仍然存在于堆栈时没有奇怪的行为。
有关对象树的详细信息,请参阅here
答案 2 :(得分:1)
通过父子关系进行的自动内存管理由QObject
完成。 QWidget
碰巧是QObject
,并且具有父窗口小部件的窗口小部件与父窗口具有相同的基础QObject。
带有子项的QObject会自动在析构函数中删除其子项。
另一个对象可以采用QObject或QWidget。例如,向布局添加窗口小部件会自动将它们重新显示到设置布局的窗口小部件。即使布局上还没有设置窗口小部件,也会在将布局添加到窗口小部件(或具有窗口小部件集的布局)时完成重新显示。它非常聪明,可以节省大量的打字并减少错误的可能性。
将小部件添加到另一个小部件的惯用,最小化方式是:
MyWidget() {
QLayout * layout = new QHBoxLayout(this); // set a layout on this widget
layout->addWidget(new QLabel("foo")); // the label is reparented to this
layout->addWidget(new QPushButton("bar")); // the button is reparented to this
}