деструкторы в Qt4
Я очень смущен использованием деструкторов в Qt4 и надеюсь, что вы, ребята, можете мне помочь.
Когда у меня есть такой метод (с " Des " является классом):
void Widget::create() {
Des *test = new Des;
test->show();
}
Как я могу убедиться, что этот виджет будет удален после его закрытия?
и в классе " Des " у меня есть это:
Des::Des()
{
QPushButton *push = new QPushButton("neu");
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(push);
setLayout(layout);
}
где и как мне удалить *push и * layout? что должно быть в деструкторе Des::~Des() ?
5 ответов
еще один вариант использования deleteLater()
или родители должны использовать функцию удаления при закрытии для виджетов. В этом случае Qt удалит виджет, когда он будет отображаться.
Des *test = new Des;
test->setAttribute( Qt::WA_DeleteOnClose );
test->show();
мне нравится использовать его с деревом объектов, которое Qt сохраняет, так что я устанавливаю delete-on-close для окна, и все виджеты в окне имеют соответствующий родитель, поэтому все они также удаляются.
Qt использует то, что они называют объект деревьев и это немного отличается от типичного подхода RAII.
на QObject
класс конструктор принимает указатель на родителя QObject
. Когда этот родитель QObject
разрушается, его дети также будут уничтожены. Это довольно распространенный шаблон во всех классах Qt, и вы заметите, что многие конструкторы принимают
ответ Richardwb хороший - но другой подход заключается в использовании слота deleteLater, например:
Des *test = new Des;
test->show();
connect(test, SIGNAL(closed()), test, SLOT(deleteLater()));
очевидно, что сигнал closed () можно заменить любым сигналом, который вы хотите.
в этом уроке предполагает, что вам не нужно явно удалять виджеты, которые были добавлены в родительские виджеты. Он также говорит, что это не больно, чтобы удалить их.
(Я не тестировал это, но я думаю, пока вы явно удаляете их до удаления родительского виджета, это должно быть нормально.)
в большинстве случаев вы должны создавать виджеты в стеке:
QPushButton push("neu");
таким образом, они удаляются, когда они выходят за рамки. Если вы действительно хотите создать их в куче, то ваша ответственность-вызвать delete на них, когда они больше не нужны.