需求

QFutureWatcher ?

解决

QFutureWatcher 一般是搭配 QFuture, QtConcurrent 来使用,用于检测多线程异步执行计算的进度,方便在主线程上进行展示或者执行其他动作。

配置 watcher

watcher_ = new QFutureWatcher<int>;
connect(watcher_, &QFutureWatcher<int>::finished,
      this, &MainWindow::busy_job_finished);

调用子线程来执行

QtConcurrent::run 提供了最简单的子线程执行函数的方法。

auto future = QtConcurrent::run(this, &MainWindow::do_busy_job);
watcher_->setFuture(future);
int MainWindow::do_busy_job()
{
    return 1;
}

执行结果

void MainWindow::busy_job_finished()
{
    // 若有需要, 关闭通知对话框

    qDebug() << "busy job finished!";
    qDebug() << "the returned value is: "
	   << watcher_->result();
}

参考

在 QT UI 编程中使用 QtConcurrent 和 QFutureWatcher 执行并发任务

使用QFuture类监控异步计算的结果

Qt多线程编程之高级函数

QFutureWatcher:异步运行监视者

Qt多线程:QtConcurrent + QFuture + QFutureWatcher

QFuture的使用:多线程与进度条

Qt QFutureWatcher

使用QFutureInterface编写异步操作