0

我现在正在将 GUI 添加到为控制台操作而编写的项目中。我选择了 Qt 作为框架,现在在处理 QProgressDialog 的关闭事件时遇到了困难。

问题 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 回答