繁体   English   中英

忙模式下的 QProgressDialog 不更新

[英]QProgressDialog in Busy Mode Does Not Update

我有一个简单的循环,我正在执行不确定长度的操作。 我设置了一个range(0,0)的 QProgressDialog 以触发其不确定的“忙碌”模式; 在我的平台上,这通常会产生一个进度条,其手柄来回弹跳。 但是,即使精简到以下内容,对话框也会出现,响应“取消”按钮,但手柄在栏的末尾被冻结在原位并且不会循环。

    QProgressDialog* progressDialog =
                     new QProgressDialog("My Progress", "Cancel",
                                         0, 0, this);
    progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
    progressDialog->setModal(true);
    progressDialog->setMinimumDuration(0);
    progressDialog->show();
    progressDialog->setValue(0);
        
    while (!done)
    {
        QThread::msleep(200);
        QCoreApplication::processEvents();
    }

显然,循环内部实际发生了更多的事情,但无论有没有内容,它的行为都是一样的; 注释掉其他所有内容后剩下的内容与描述的一样。

为什么我的进度句柄不来回弹跳?

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

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

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

这是从“所有”代码(或几乎)复制的示例,并且忙碌栏确实显示正确。

#include <QApplication>
#include <QProgressDialog>
#include <QThread>

void job()
{
    bool done =true;
    while (!done)
    {
        QThread::msleep(1000);
        QApplication::processEvents();
    }
}

int main(int argc, char *argv[])
{

    bool done = false;
    QApplication a(argc, argv);
    QProgressDialog* progressDialog = new QProgressDialog("My Progress", "Cancel",

                                         0, 0, nullptr);
    progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
    progressDialog->setModal(true);
    progressDialog->setMinimumDuration(0);
    progressDialog->show();
    progressDialog->setValue(0);

    QThread* thread = QThread::create(job);
    thread->start();

    return a.exec();
}

这是繁忙栏的结果(它会根据您的需要向后移动和第四个移动)

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM