[Qt] ウィンドウを閉じた際、同時にdeleteする

Windowを閉じたらdeleteしたい

ウィンドウを生成して、画面が閉じられたら同時に破棄したい場合について。
下記のように、ウィンドウのcloseシグナルを拾う等の処理は、不要です。

// 悪い例

void MyClass::openMyWindow(){
  MyWindow *window = new MyWindow();
  connect(window, SIGNAL(closed()), this, SLOT(deleteSlot()));
  window->show();
}

void MyClass::deleteSlot()
{
  static_cast<QWidget *>(sender())->deleteLater();
}

Qtドキュメントの確認

QWidgetの「close()」スロットの説明に、以下のようにあります。
bool QWidget::close()

ウィジェットを閉じます。ウィジェットが閉じられたらtrue, そうでなければfalseを返します。
First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.
はじめにQCloseEventを送出し、そのcloseEventがacceptされたらウィジェットはhiddenされ、ignoreされたら何も起きません。
デフォルトのcloseEventは、closeEventをacceptします。
このときウィジェットにQt::WA_DeleteOnCloseフラグが設定されていたら、ウィジェットはdeleteされます
closeEventは、ウィジェットの表示/非表示に関わらず届きます。

とのこと。
つまり、QWidget::setAttributeQt::WA_DeleteOnCloseフラグを立てておいてやれば、closeEventが届いたときに勝手にdeleteしてくれるというわけです。

冒頭のコードを書き直す

以下のように修正できます。より簡潔で安全になりました。

MyWindow *window = new MyWindow();
window->setAttribute(Qt::WA_DeleteOnClose); // これがキモ
window->show();