現在、コンソール操作用に書かれたプロジェクトのオリジナルに GUI を追加しています。フレームワークとして Qt を選択しましたが、QProgressDialog の close イベントの処理が困難になりました。
問題 1: QtConcurrent::run を使用して、長時間/重いタスクのプロセスをフォークし、「待機中」の QProgressDialog (範囲 0,0) を使用して、長時間実行されているプロセスについてユーザーにヒントを与えました。問題は、ダイアログを閉じることができないことです!
void MainWindow::doLongRunProcess() {
pDialog = new QProgressDialog("Loading 2 ...", "Abort", 0, 0, this);
pDialog->setWindowModality(Qt::WindowModal);
pDialog->show();
QFuture<void> future = QtConcurrent::run(theApp, &SimApplication::runSimulation);
QFutureWatcher<void> watcher;
connect(&watcher,
SIGNAL(finished()),
this,
SLOT(endLongRunProcess()));
watcher.setFuture(future);
// at this point, the runSimulation is successfully invoked
}
void MainWindow::endLongRunProcess()
{
// no sign of being invoked!
if (pDialog)
{
pDialog->close();
delete pDialog;
}
logMessage("Operation completed");
}
要件 1: 可能であれば、元のパッケージのコードに触れたり変更したりしたくない。
問題 2: 「中止」ボタンをリンクして SimApplication::runSimulation() を終了する方法は?