【问题标题】:QProgressBar not showing progress?QProgressBar 不显示进度?
【发布时间】:2011-02-17 21:23:43
【问题描述】:

我更新进度条的第一个天真想法是在我的循环中包含以下行,它正在执行处理,如下所示:

while(data.hasMoreItems())
{
    doSomeProcessing(data.nextItem())

    //Added these lines but they don't do anything
    ui->progressBar->setValue(numberProcessed++);
    ui->progressBar->repaint();
}

我认为添加 repaint() 会在更新 GUI 时暂停执行,但显然它不是那么简单。看完问题后:

QProgressBar Error
Progress bar is not showing progress

看起来我将不得不将数据处理放在不同的线程中,然后将来自数据处理线程的信号连接到 GUI 线程以更新进度条。我对 GUI 和线程相当缺乏经验,我想知道是否有人能指出我正确的方向,即我应该考虑使用哪些 Qt 类。我想我需要一个 QThread 对象,但我一直在查看 QProgressBar 文档,但它没有提出线程的主题。

【问题讨论】:

    标签: multithreading user-interface qt


    【解决方案1】:

    正如@rjh 和@Georg 所指出的,基本上有两种不同的选择:

    1. 使用QApplication::processEvents() 强制处理事件,或者
    2. 创建一个thread,它发出可用于更新进度条的信号

    如果您正在进行任何重要的处理,我建议您将处理移至线程。

    关于线程最重要的一点是,除了主 GUI 线程(您不会启动或创建)之外,您永远不能直接从线程内更新 GUI

    QObject::connect() 的最后一个参数是Qt::ConnectionType 枚举,默认情况下会考虑是否涉及线程。

    因此,您应该能够创建一个简单的 QThread 子类来进行处理:

    class DataProcessingThread : public QThread
     {
    
     public:
         void run();
     signals:
         void percentageComplete(int);
     };
    
     void MyThread::run()
     {
        while(data.hasMoreItems())
        {
          doSomeProcessing(data.nextItem())
          emit percentageCompleted(computePercentageCompleted());
        }
     }
    

    然后在您的 GUI 代码中的某处:

    DataProcessingThread dataProcessor(/*data*/);
    connect(dataProcessor, SIGNAL(percentageCompleted(int)), progressBar, SLOT(setValue(int));
    dataProcessor.start();
    

    【讨论】:

      【解决方案2】:

      您需要在处理循环中定期调用 QApplication::processEvents() 以让它处理 UI 事件。

      正如 Georg 所说,Qt 是一个单线程协作多任务环境。您可以完全控制您的流程,直到您使用 processEvents() 自愿放弃它 - 在您这样做之前,Qt 无法更新 UI 元素、处理异步 HTTP 请求、处理输入或几乎其他任何事情。当您处于一个较长的处理循环中时,您可以确保这些东西得到一个时间片。

      【讨论】:

        【解决方案3】:

        您可以创建一个QThread 的子类,它发出一个信号progressChanged,并连接到QProgressBar

        connect() 默认连接auto connections。这意味着信号槽机制已经为您解决了线程问题,因此您无需担心。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-07
          • 2023-03-07
          • 1970-01-01
          • 2023-03-10
          相关资源
          最近更新 更多