在Qt4的析构函数(destructors in Qt4)

2019-07-18 08:05发布

我对使用的Qt4和希望析构函数很困惑,你们能帮助我。
当我有这样的方法(用“辅”是一个类):

void Widget::create() {
    Des *test = new Des;
    test->show();
}

我如何才能确保这个widget会被关闭后删除?

在课堂上“梅”我有这样的:

Des::Des()
{
    QPushButton *push = new QPushButton("neu");
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(push);
    setLayout(layout);
}

在那里和我有如何删除*推动和*布局? 应该在析构函数德::〜DES()是什么?

Answer 1:

另一种选择使用deleteLater()或父母,是使用delete-ON-关闭功能的部件。 在这种情况下,当显示完成的Qt将删除该小部件。

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

我喜欢与Qt的保留,让我删除设置上关闭该窗口的对象树使用它,并在窗口中的所有部件都指定一个适当的父母,所以他们都得到删除。



Answer 2:

Qt使用他们所谓的对象树 ,它是从典型的RAII做法有点不同。

QObject类的构造函数需要一个指针到父QObject 。 当父母QObject遭到破坏,其子女也将被销毁。 这是整个Qt的类相当普遍的模式和构造函数接受,你会发现有很多*parent参数。

如果你看一些了Qt的例子程序 ,你会发现,他们实际上构建在堆中最Qt的对象,并借此对象树的优势来处理破坏。 我个人认为这种策略也是有用的,因为GUI对象可以有特殊的寿命。

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
}


Answer 3:

Richardwb的回答是一个很好的 - 但另一种方法是使用deleteLater插槽,就像这样:

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

显然,关闭()信号可以用任何你想要的信号所取代。



Answer 4:

本教程建议你不需要显式删除已添加到父控件部件。 它还表示,它不会伤害到做删除他们要么。

(我没有测试过这一点,但我想只要你明确地删除它们之前父窗口部件被删除,这个应该没问题。)



Answer 5:

在大多数情况下,你应该在栈上创建的小部件:

    QPushButton push("neu");

这样一来,当他们成为了其作用范围时被删除。 如果你真的想在堆上创建它们,那么这是你的责任,呼吁他们删除不再需要的时候。



文章来源: destructors in Qt4