C++ 忙碌模式下的QProgressDialog不更新

C++ 忙碌模式下的QProgressDialog不更新,c++,qt,qthread,qprogressdialog,C++,Qt,Qthread,Qprogressdialog,我有一个简单的循环,在这里我执行一个不确定长度的操作。我设置了一个带有范围(0,0)的QProgressDialog,以触发其不确定的“忙”模式;在我的平台上,这通常会生成一个进度条,其控制柄会来回反弹。尽管如此,该对话框仍会出现,响应“取消”按钮,但控制柄在条的末端被冻结在适当位置,不会循环 QProgressDialog*progressDialog= 新建QProgressDialog(“我的进度”、“取消”, 0,0,这个),; progressDialog->setAttribute(

我有一个简单的循环,在这里我执行一个不确定长度的操作。我设置了一个带有
范围(0,0)
的QProgressDialog,以触发其不确定的“忙”模式;在我的平台上,这通常会生成一个进度条,其控制柄会来回反弹。尽管如此,该对话框仍会出现,响应“取消”按钮,但控制柄在条的末端被冻结在适当位置,不会循环

QProgressDialog*progressDialog=
新建QProgressDialog(“我的进度”、“取消”,
0,0,这个),;
progressDialog->setAttribute(Qt::WA_DeleteOnClose,true);
progressDialog->setModal(真);
progressDialog->setMinimumDuration(0);
progressDialog->show();
progressDialog->setValue(0);
而(!完成)
{
QThread::msleep(200);
QCoreApplication::processEvents();
}
显然,在循环中有更多的实际操作,但无论是否包含内容,其行为都是相同的;在注释掉所有其他行为之后,上面剩下的内容将按照所描述的方式进行


为什么我的进度句柄没有来回跳动?

您的问题不是
QProgressDialog
问题,而是线程问题

您的GUI线程正在同一个线程中运行进度条和“作业”。我所说的“job”是指循环中的所有内容,它被认为是模拟“busy”模式,因为在实际情况下它需要很长时间。因此,当线程在睡眠时处于“忙碌”状态时,GUI不会像在同一线程中一样移动

您应该使用thread(或QThread)启动作业,以允许GUI在GUI线程中独立运行

下面是一个从“所有”代码(或几乎)复制的示例,繁忙条确实显示正确

#包括
#包括
#包括
作废职务()
{
bool done=true;
而(!完成)
{
QThread::msleep(1000);
QApplication::processEvents();
}
}
int main(int argc,char*argv[])
{
bool done=false;
质量保证申请a(argc、argv);
QProgressDialog*progressDialog=新建QProgressDialog(“我的进度”、“取消”,
0,0,空PTR);
progressDialog->setAttribute(Qt::WA_DeleteOnClose,true);
progressDialog->setModal(真);
progressDialog->setMinimumDuration(0);
progressDialog->show();
progressDialog->setValue(0);
QThread*thread=QThread::create(作业);
线程->开始();
返回a.exec();
}
这是忙碌条的结果(它会根据您的需要向后移动到第四个)


您的问题不是
QProgressDialog
问题,而是线程问题

您的GUI线程正在同一个线程中运行进度条和“作业”。我所说的“job”是指循环中的所有内容,它被认为是模拟“busy”模式,因为在实际情况下它需要很长时间。因此,当线程在睡眠时处于“忙碌”状态时,GUI不会像在同一线程中一样移动

您应该使用thread(或QThread)启动作业,以允许GUI在GUI线程中独立运行

下面是一个从“所有”代码(或几乎)复制的示例,繁忙条确实显示正确

#包括
#包括
#包括
作废职务()
{
bool done=true;
而(!完成)
{
QThread::msleep(1000);
QApplication::processEvents();
}
}
int main(int argc,char*argv[])
{
bool done=false;
质量保证申请a(argc、argv);
QProgressDialog*progressDialog=新建QProgressDialog(“我的进度”、“取消”,
0,0,空PTR);
progressDialog->setAttribute(Qt::WA_DeleteOnClose,true);
progressDialog->setModal(真);
progressDialog->setMinimumDuration(0);
progressDialog->show();
progressDialog->setValue(0);
QThread*thread=QThread::create(作业);
线程->开始();
返回a.exec();
}
这是忙碌条的结果(它会根据您的需要向后移动到第四个)


请编辑您的问题以提供答案。事实上,我无法重现这个问题(Suse Linux,Qt5.14.1)。上面的例子确实重现了这个问题。如果相关的话,我使用的是Qt5.9.2。请编辑您的问题以提供答案。事实上,我无法重现这个问题(Suse Linux,Qt5.14.1)。上面的例子确实重现了这个问题。如果相关的话,我使用的是Qt5.9.2。