我在更新进度条时的第一个天真的做法是在正在进行处理的循环中包含以下几行,制作如下内容:
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错误 https://stackoverflow.com/questions/2184400/qprogressbar-error
进度条不显示进度 https://stackoverflow.com/questions/2513567/progress-bar-is-not-showing-progress-results
看来我必须将数据处理放在不同的线程中,然后将信号从数据处理线程连接到 GUI 线程以更新进度条。我对 GUI 和线程相当缺乏经验,我想知道是否有人可以为我指出正确的方向,即我应该为此使用哪些 Qt 类。我想我需要一个 QThread 对象,但我一直在查看 QProgressBar 文档,但它没有提出线程主题。
正如 @rjh 和 @Georg 所指出的,本质上有两种不同的选择:
- 使用强制处理事件QApplication::processEvents() https://doc.qt.io/qt-5/qcoreapplication.html#processEvents, OR
- 创建一个thread https://doc.qt.io/qt-5/qthread.html发出可用于更新进度条的信号
如果您正在进行任何重要的处理,我建议将处理移至线程。
关于线程,要了解的最重要的一点是,除了主 GUI 线程(您不启动也不创建)之外,你永远不能直接从线程内更新 GUI.
最后一个参数为QObject::connect() https://doc.qt.io/qt-5/qobject.html#connect-2 is a Qt::连接类型 https://doc.qt.io/qt-5/qt.html#ConnectionType-enum默认情况下考虑是否涉及线程的枚举。
因此,您应该能够创建一个简单的子类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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)