1行でかくと QTimer::singleShot便利だよね。
ファイルダイアログだけ出力して、選択されたファイルを処理し、すぐにプログラムを終了させるには、QTimer::singleShot(0, func)
を使うとよい。
ちょっとしたツールなどで、ファイル選択ダイアログだけ表示して、選択されたファイルを処理して、プログラムを終了させたいことがある。
ためしに、app.exec()
する前に、ダイアログを dlg.exec()
みたいにしてしまうと、ファイル処理後に アプリケーションのイベントループが止まらずに、プログラムが終了しなかった。
解決策 QTimer::singleShot でイベントループにイベントを予めつっこんでおくといい
下記のように、QTimer::singleShot で呼び出したい関数を指定しておくと、
イベントループに、タイマイベントが挿入される。挿入されたイベントは、app.exec()
を呼び出したタイミングで呼び出されるため、start が実行される。
この方法だと、start()
が終了した時点でプログラムが終了する。
# include <QApplication>
# include <QFileDialog>
# include <QTimer>
void start()
{
QFileDialog dlg(0);
dlg.exec();
if (dlg.result() != QFileDialog::Accepted) {
return; // QApplication::instance()->exit(status)でも可
}
// 選択したファイルを元に何か処理する。
return;
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
// app.exec() した時点で、すぐに(0 ミリ秒後に)start関数を呼び出す。
QTimer::singleShot(0, start);
app.exec();
}