деструкторы в 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 на них, когда они больше не нужны.