Qt ではフォームの構築はコンストラクタ内で行う通常の処理で完了しています。
QWidget::close()
の挙動については ドキュメント に記載のある通り、Qt ではトップレベルの QWidget
を close()
すると自動的にアプリケーションが終了するようなデフォルトの設定になっています。
一般的には QWidget::show()
を実行し、Qt のイベントループが1サイクル経過した後のタイミング が close()
が実際に効くタイミングとなります。
というわけで、コンストラクタの中(より正確にやるのであれば showEvent()
の中)で以下のどちらかの方法で、イベントループ内で自身の close()
が呼ばれるようにする必要があります。
c++
1// イベントループ内で実行されるタイマーを利用し0秒後に閉じる方法
2QTimer::singleShot(0, this, &QWidget::close);
c++
1// this の close() スロットをイベントループ経由で遅延呼び出しする方法
2QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
上記のサンプルコードでは QWidget::close()
を呼び出していますが、ラムダ式や独自のスロットを指定することで任意の処理を実行することができます。
c++
1QTimer::singleShot(0, [this]() {
2 qDebug() << "closing";
3 close();
4});
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。