c++ - 如何实现QProgressDialog?

标签 c++ qt qthread qprogressdialog

我尝试使用 QProgressDialog 向用户提供有关长任务进度的一些信息,同时允许他取消此任务。

基本上,我有一个带有按钮ComputeQDialog。通过单击它,一个耗时的方法在我的 QDialog 的父级成员上被调用。此方法接受一个回调来告诉调用者工作的进度。

问题是进度对话框在出现之前需要一些时间,并且不会立即考虑点击其 Cancel 按钮。

很明显我的代码中有一个小故障,但我不习惯 Qt,我尝试了很多东西。我可能需要一个单独的线程。

我的代码摘录:

void MyDialog::callbackFunction(int value, void * objPtr) {
  ((QProgressDialog *)(objPtr))->setValue(value);
  QCoreApplication::processEvents();
}

void MyDialog::on_mComputeBtn_clicked()
{
   Compute();
}

void MyDialog::Compute()
{
  QProgressDialog progressDialog("Optimization in progress...", "Cancel", 0, 100, this);
  progressDialog.setMinimumDuration(500); // 500 ms
  progressDialog.setWindowModality(Qt::WindowModal);
  progressDialog.setValue(0);
  connect(&progressDialog, SIGNAL(canceled()), this, SLOT(Cancel()));
  QCoreApplication::processEvents();

    parentMember->LongComputation(callbackFunction);

    // probably useless
  progressDialog.reset();
  progressDialog.hide();
  QCoreApplication::processEvents();
}

最佳答案

对话框不会立即出现,因为您将最短持续时间设置为 500 毫秒。将其设置为 0 以使对话框在进度更改时立即显示或手动调用其显示功能。

为了使取消按钮起作用,将您的长计算移动到另一个线程(例如使用 QThread 或 std::async )并让您的主事件循环继续执行。

实际上您的代码存在很多问题,但这两点应该为您指明了正确的方向。根据我的经验,每次手动调用 processEvents 都是一种很大的代码味道。

关于c++ - 如何实现QProgressDialog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48744248/

相关文章:

qt - QDir::makeAbsolute() 怎么会失败?

database - 与 QTableView 内的数据交互的最佳方式

python - 如何破解 xlib 的 next_event()?

Qthread 在 Golang 中只发出一个信号

c++ - 类析构函数中的堆损坏?

c++ - 使用 Vista x64 在 Visual Studio 2008 中创建 C++ 项目时出现无效类字符串错误

c++ - 如何显示模型中函数的进度条?

c++ - 无法使用数据断点 C++,Visual Studio 2013

c++ - 与尾部的蛇比赛碰撞

QThread 不能正常工作