読者です 読者をやめる 読者になる 読者になる

Turn On Blog

ぺーぺーSEの色々メモ

【Qt】ウィンドウが閉じられるときに、あわせてdeleteする

ウィンドウを生成して、画面が閉じられたら同時に破棄したいこと、よくありますよね。
(あるかな)

こんなふうにやってました。ちょっとまえまで。

MyWindow *window = new MyWindow();
connect(window, SIGNAL(closed()), this, SLOT(deleteSender()));
window->show();
void MyClass::deleteSender()
{
  static_cast<QWidget *>(sender())->deleteLater();
}

公式ドキュメントをみてみると

QWidgetの「close()」スロットの記述を眺めてみましょう。
QWidget Class | Qt Widgets 5.4

Closes this widget. Returns true if the widget was closed; otherwise returns false.
ウィジェットを閉じます。ウィジェットが閉じられたら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します。


If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.
このときウィジェットにQt::WA_DeleteOnCloseフラグが設定されていたら、、ウィジェットはdeleteされます
closeEventは、ウィジェットの表示/非表示に関わらず届きます。

とのこと。
つまり、QWidget Class | Qt Widgets 5.4メソッドでQt::WA_DeleteOnCloseフラグを立てておいてやれば、closeEventが届いたときに勝手にcloseしてくれるというわけです。

冒頭のコードを書き直すと

以下のように修正できます。

MyWindow *window = new MyWindow();
window->setAttribute(Qt::WA_DeleteOnClose);
window->show();

無駄なslotとconnectがなくなり、deleteのタイミングを気にする必要もなくなりました。めでたし