Apache Демон палаты общин запустит Вашу программу Java как демон Linux или Услуги WinNT.
Другой вариант использования deleteLater ()
или родителей - это использование функции удаления при закрытии для виджетов. В этом случае Qt удалит виджет, когда он будет отображен.
Des *test = new Des;
test->setAttribute( Qt::WA_DeleteOnClose );
test->show();
Мне нравится использовать его с деревом объектов, которое хранит Qt, поэтому я устанавливаю удаление при закрытии для окна и всех виджетов в window имеет правильный родительский элемент, поэтому все они также будут удалены.
Qt использует то, что они называют деревьями объектов , и это немного отличается от типичного подхода RAII.
Конструктор QObject
class принимает указатель на родительский QObject
. Когда этот родительский QObject
уничтожается, его дочерние элементы также будут уничтожены. Это довольно распространенный шаблон во всех классах Qt, и вы заметите, что многие конструкторы принимают параметр * parent
.
Если вы посмотрите на некоторые из примеров программ Qt , вы Я обнаружу, что они фактически создают большинство объектов Qt в куче и используют это дерево объектов для обработки разрушения. Я лично нашел эту стратегию полезной, так как объекты графического интерфейса могут иметь свое время жизни.
Qt не предоставляет никаких дополнительных гарантий, кроме стандартного C ++, если вы не используете QObject
или подкласс QObject
(например, QWidget
).
В вашем конкретном примере нет гарантии, что что-то будет удалено.
Вам понадобится что-то подобное для Des
(при условии, что Des
является подклассом QWidget
):
class Des : public QWidget
{
Q_OBJECT
public:
Des(QWidget* parent)
: QWidget(parent)
{
QPushButton* push = new QPushButton("neu");
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(push); // this re-parents push so layout
// is the parent of push
setLayout(layout);
}
~Des()
{
// empty, since when Des is destroyed, all its children (in Qt terms)
// will be destroyed as well
}
}
И вы бы использовали класс Des
так:
int someFunction()
{
// on the heap
Des* test = new Des(parent); // where parent is a QWidget*
test->show();
...
// test will be destroyed when its parent is destroyed
// or on the stack
Des foo(0);
foo.show();
...
// foo will fall out of scope and get deleted
}
Ответ Richardwb - хороший - но другой подход - использовать слот deleteLater, например:
Des *test = new Des;
test->show();
connect(test, SIGNAL(closed()), test, SLOT(deleteLater()));
Очевидно, что сигнал closed () может быть заменен любым сигналом, который вы хотите.
This tutorial suggests you don't need to explicitly delete widgets that have been added to parent widgets. It also says it doesn't hurt to do delete them either.
(I've not tested this, but I guess as long as you explicitly delete them before the parent widget is deleted, this should be OK.)
В большинстве случаев вам следует создавать виджеты в стеке:
QPushButton push("neu");
Таким образом, они удаляются, когда выходят за пределы области видимости. Если вы действительно хотите создать их в куче, то вы обязаны вызвать для них delete, когда они больше не нужны.