【问题标题】:Proper use of progress bar in Qt?Qt中进度条的正确使用?
【发布时间】:2014-05-07 07:20:05
【问题描述】:

我必须通过串口发送文件,所以我使用了一个单独的线程,名为serialWorker

在主线程中我有这个:

ui->progressBar->setMaximum(file.size());    

QTextStream in(&file);
while(!in.atEnd()){

    serialWorker.send(line);  

    ui->progressBar->setValue(in.pos());        

}

问题是进度条不是“实时的”,即由于serialWorker没有阻塞主线程,循环运行无需等待。我应该如何更好地解决这个问题?

【问题讨论】:

  • 什么是serialWorker?
  • 管理连接的线程。
  • 你不能检测到,当这个线程完成并且你的行被处理了吗?它发出信号还是退出?如果是,那么当线程或行处理完成时,您可以增加进度条。
  • 好的,我想我可以在我发送完一行时发出一个信号。

标签: c++ multithreading qt progress-bar


【解决方案1】:

您正在循环中更新进度条,这会阻塞主 GUI 线程,因此您的进度条不会更新。

您应该在您的 serialWorker 中使用一个信号来通知您用户界面中的进度条进度值。在您的发送函数中,您应该发出具有适当值的信号。信号是这样的:

void progressChanged(int val);

您还应该将 progressChanged(int) 信号连接到 QProgressBar 的 setValue(int value) 槽。

最后一点是,当它在另一个线程中时,你不应该直接调用send。正确的方法是将 send 定义为一个 slot,并将一个信号连接到该 slot 并在您想要调用 send 时发出信号。

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多