0

現在、コンソール操作用に書かれたプロジェクトのオリジナルに 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() を終了する方法は?

4

1 に答える 1

1

ダイアログを作成した後でダイアログを呼び出してみて、自分のスロットではなくダイアログのスロットにsetAttribute(Qt::WA_DeleteOnClose, true)アタッチしてください。ダイアログは、必要に応じてそれ自体を削除します。finished()close()QObject::deleteLater()

于 2013-01-21T21:21:02.837 に答える