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::setAttributeでQt::WA_DeleteOnClose
フラグを立てておいてやれば、closeEvent
が届いたときに勝手にdelete
してくれるというわけです。
冒頭のコードを書き直す
以下のように修正できます。より簡潔で安全になりました。
MyWindow *window = new MyWindow();
window->setAttribute(Qt::WA_DeleteOnClose); // これがキモ
window->show();