我对使用的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()是什么?
另一种选择使用deleteLater()
或父母,是使用delete-ON-关闭功能的部件。 在这种情况下,当显示完成的Qt将删除该小部件。
Des *test = new Des;
test->setAttribute( Qt::WA_DeleteOnClose );
test->show();
我喜欢与Qt的保留,让我删除设置上关闭该窗口的对象树使用它,并在窗口中的所有部件都指定一个适当的父母,所以他们都得到删除。
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
}
Richardwb的回答是一个很好的 - 但另一种方法是使用deleteLater插槽,就像这样:
Des *test = new Des;
test->show();
connect(test, SIGNAL(closed()), test, SLOT(deleteLater()));
显然,关闭()信号可以用任何你想要的信号所取代。
本教程建议你不需要显式删除已添加到父控件部件。 它还表示,它不会伤害到做删除他们要么。
(我没有测试过这一点,但我想只要你明确地删除它们之前父窗口部件被删除,这个应该没问题。)
在大多数情况下,你应该在栈上创建的小部件:
QPushButton push("neu");
这样一来,当他们成为了其作用范围时被删除。 如果你真的想在堆上创建它们,那么这是你的责任,呼吁他们删除不再需要的时候。