gpt4 book ai didi

c++ - 如何实现QProgressDialog?

转载 作者:行者123 更新时间:2023-11-27 22:41:18 25 4
gpt4 key购买 nike

我尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com