LoginSignup
2
3

More than 5 years have passed since last update.

Qt でプログラム起動時にファイルダイアログだけ表示する

Last updated at Posted at 2016-02-24

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();
}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3