在这里删除带有deleteLater()的sender()是否安全?

时间:2012-05-03 14:46:17

标签: qt4

假设一些基于QDialog的类调用了一些插槽,

我在其他地方创建了对话框,例如

 MyDialog *dlg = new MyDialog (this);
 connect (dlg , SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
 dlg->exec ();

在插槽中,我删除了它的“最深”的父类,即QObject:

 void slotGetValue (const QString & key)
 {
    // process the value we retrieved
    // now delete the dialog created
    sender()->deletLater ();
 }

这是正确的做法吗?这样安全吗?

1 个答案:

答案 0 :(得分:1)

没有理由删除模态对话框。由于QDialog :: exec()阻塞,因此可以在返回后立即安全地删除该对话框。

MyDialog *dlg = new MyDialog (this);
connect (dlg , SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
dlg->exec ();
delete (dlg);

由此可以猜测,不需要使用new和delete。你可以把它放在堆栈上,它会在离开范围时被销毁。像这样:

MyDialog dlg(this);
connect(&dlg, SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
dlg.exec();

除非你在MyDialog构造函数中需要this指针,否则没有理由传递它。