I am relatively new to the Qt framework and I was wondering if I should delete pointers in my program. I know that, in C++, if memory is not return it could lead to memory leak, but I am not sure if the same applies to Qt.
#include "mainwindow.h"
#include <QApplication>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QIcon>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *w = new QWidget();
w->setWindowTitle("Music Player");
QIcon * mainwind_icon = new QIcon("MusicPlayer.png");
w->setWindowIcon(*mainwind_icon);
QPushButton * enter_button = new QPushButton();
QTextEdit * textbox = new QTextEdit();
QHBoxLayout * vlayout = new QHBoxLayout;
vlayout->addWidget(textbox);
vlayout->addWidget(enter_button);
w->setLayout(vlayout);
w -> show();
return a.exec();
}
-
2\$\begingroup\$ ratchet freak's answer is more relevant (and correct) to your specific Qt question. You don't need to delete anything manually if it's parented. \$\endgroup\$user23437– user234372014年03月02日 06:08:25 +00:00Commented Mar 2, 2014 at 6:08
1 Answer 1
In Qt, there is a concept of parents and a hierarchy.
In essence, it means that when a qobject owns another qobject (the other qobject's parent
is the first) then the parent will take care of cleaning its children.
There are 2 ways an object becomes a child of another: when it is set in the constructor or when reparented. The qwidget family automatically reparents widgets which you add to it
Common use for the main function is to allocate the root statically and all the rest dynamically as child of the root:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w ();
w.setWindowTitle("Music Player");
QIcon * mainwind_icon = new QIcon("MusicPlayer.png");
w.setWindowIcon(*mainwind_icon);
QPushButton * enter_button = new QPushButton();
QTextEdit * textbox = new QTextEdit();
QHBoxLayout * vlayout = new QHBoxLayout;
vlayout->addWidget(textbox);
vlayout->addWidget(enter_button);
w.setLayout(vlayout);
w.show();
return a.exec();
}
The setlayout
takes ownership of the vlayout
and its children so the destructor of w
will delete those as well
When you are inside an event loop then you can delete a qobject by calling deleteLater
on it which will schedule the object (and its children) for deletion. You can also connect a signal to it if needed.