gpt4 book ai didi

multithreading - QProgressBar 不显示进度?

转载 作者:行者123 更新时间:2023-12-04 01:35:24 26 4
gpt4 key购买 nike

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

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 文档,但它没有提出线程的主题。

最佳答案

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

  • 使用 QApplication::processEvents() 强制处理事件, 或
  • 创建 thread发出可用于更新进度条的信号

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

    关于线程,最重要的一点是除了主 GUI 线程(您既不启动也不创建), 您永远不能直接从线程中更新 GUI .

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

    因此,您应该能够创建 QThread 的简单子(monad)类。进行处理:
    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();

    关于multithreading - QProgressBar 不显示进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806552/

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