【问题标题】:QProgressDialog in Busy Mode Does Not Update忙碌模式下的 QProgressDialog 不更新
【发布时间】:2020-06-19 10:31:01
【问题描述】:

我有一个简单的循环,我正在执行一个不确定长度的操作。我用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();
    }

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

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

【问题讨论】:

  • 请编辑您的问题以提供minimal reproducible example。因为它是我无法重现问题(Suse Linux,Qt5.14.1)。
  • 上面的例子确实重现了这个问题。如果相关,我使用的是 Qt 5.9.2。

标签: c++ qt qthread qprogressdialog


【解决方案1】:

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

您正在同一个线程(您的 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();
}

这里是繁忙栏的结果(它可以根据需要向后移动第四个)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2012-07-28
    • 2013-04-21
    • 1970-01-01
    • 2019-01-20
    • 2012-02-01
    相关资源
    最近更新 更多