деструкторы в Qt4

Apache Демон палаты общин запустит Вашу программу Java как демон Linux или Услуги WinNT.

11
задан Berschi 17 September 2009 в 05:48
поделиться

5 ответов

Другой вариант использования deleteLater () или родителей - это использование функции удаления при закрытии для виджетов. В этом случае Qt удалит виджет, когда он будет отображен.

Des *test = new Des;
test->setAttribute( Qt::WA_DeleteOnClose );
test->show();

Мне нравится использовать его с деревом объектов, которое хранит Qt, поэтому я устанавливаю удаление при закрытии для окна и всех виджетов в window имеет правильный родительский элемент, поэтому все они также будут удалены.

12
ответ дан 3 December 2019 в 01:16
поделиться

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
}
21
ответ дан 3 December 2019 в 01:16
поделиться

Ответ Richardwb - хороший - но другой подход - использовать слот deleteLater, например:

Des *test = new Des;
test->show();
connect(test, SIGNAL(closed()), test, SLOT(deleteLater()));

Очевидно, что сигнал closed () может быть заменен любым сигналом, который вы хотите.

5
ответ дан 3 December 2019 в 01:16
поделиться

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.)

3
ответ дан 3 December 2019 в 01:16
поделиться

В большинстве случаев вам следует создавать виджеты в стеке:

    QPushButton push("neu");

Таким образом, они удаляются, когда выходят за пределы области видимости. Если вы действительно хотите создать их в куче, то вы обязаны вызвать для них delete, когда они больше не нужны.

2
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: