この動作は、Qt フレームワークのイベント ループ (Event Loop) メカニズムによって発生します。Qt アプリケーションが実行されると、ユーザー入力、イベント、シグナルの処理を担当するイベント ループに入り、それに応じて対応するスロット関数またはハンドラーを呼び出します。
Qt アプリケーションのメイン ウィンドウを閉じると、メイン ウィンドウは close イベントを発行します。デフォルトでは、Qt はこのシャットダウン イベントをアプリケーションのイベント ループに渡します。イベント ループは、現在のアプリケーションで開いているウィンドウが他にあるかどうかを確認します。他のウィンドウが開いている場合、イベント ループは実行を続け、他のイベントが処理されるのを待ちます。イベント ループは、すべてのウィンドウが閉じられた場合にのみ終了し、アプリケーションが終了します。
この設計にはいくつかの利点があります。
- マルチウィンドウ アプリケーションでは、ユーザーはメイン ウィンドウを閉じて、アプリケーション全体を誤って終了することなく、他の子ウィンドウの操作を続けることができます。
- クリーンアップ操作の実行や、未保存のデータを保存するかどうかをユーザーに尋ねるなど、アプリケーションがシャットダウン イベントを処理できるようにします。
QCoreApplication::quit() または QApplication::quit() メソッドを使用して、イベント ループを手動で終了し、アプリケーションを終了できます。 - メイン ウィンドウを閉じるときに、他のウィンドウが閉じるのを待たずにアプリケーションをすぐに終了したい場合は、Qt::WA_QuitOnClose プロパティを使用できます。このプロパティを true に設定すると、メイン ウィンドウが閉じられるとすぐにアプリケーションを終了するように Qt に指示されます。たとえば、メイン ウィンドウ クラスのコンストラクターに次のコードを追加できます。
setWindowFlag(Qt::WA_QuitOnClose, true);
この設定では、メイン ウィンドウを閉じると、他のウィンドウが閉じるのを待たずに、アプリケーションがすぐに終了します。
このプロパティはメイン ウィンドウに対してのみ有効であり、メイン ウィンドウ以外の他のウィンドウに対しては有効ではないことに注意してください。
QCoreApplication::aboutToQuit() は、アプリケーションが終了しようとする直前に発行される、Qt によって提供されるシグナルです。この信号を対応するスロット関数に接続することで、クリーンアップ操作やその他の必要な操作を実行できます。
QCoreApplication::aboutToQuit() シグナルを使用した簡単な例を次に示します。
#include <QCoreApplication>
#include <QDebug>
class MyApplication : public QCoreApplication
{
public:
MyApplication(int& argc, char** argv) : QCoreApplication(argc, argv)
{
// 连接 aboutToQuit 信号到槽函数
connect(this, &QCoreApplication::aboutToQuit, this, &MyApplication::cleanup);
}
private slots:
void cleanup()
{
// 在应用程序即将退出时执行清理操作
qDebug() << "Performing cleanup before application quits...";
// 在这里可以添加你的文件保存操作或其他清理逻辑
// 退出应用程序
quit();
}
};
int main(int argc, char** argv)
{
MyApplication app(argc, argv);
// 在这里添加你的应用程序逻辑
// ...
// 执行应用程序事件循环
return app.exec();
}
上記の例では、QCoreApplication を継承するカスタム MyApplication クラスを作成しました。コンストラクターでは、connect() 関数を使用して、aboutToQuit シグナルを cleanup() スロットに接続します。cleanup() スロット関数では、ファイルの保存やネットワーク接続の終了など、アプリケーションを終了する前に実行する必要があるクリーニング操作を実行できます。最後に、cleanup() 関数の quit() メソッドを呼び出して、アプリケーションを終了します。
QCoreApplication の代わりに QApplication を使用している場合は、QApplication から MyApplication クラスを継承し、それに応じて調整できることに注意してください。