如何在QT C++中的另一个线程中更新progressBar中的值
How to update value in progressBar in another thread in QT c++
我开发了一个带有界面的qt程序。我还有一个复杂的计算,它是在 ui 线程的单独线程上完成的。我想从完成计算的线程更新进度条。但是我得到一个错误,我不能更改属于另一个线程的对象。
这是我的代码:
void Somefunc()
{
ui->progressBar->setValue(progress);
}
void MainWindow::on_pushButton_3_clicked()
{
auto futureWatcher = new QFutureWatcher<void>(this);
QObject::connect(futureWatcher, &QFutureWatcher<void>::finished, futureWatcher, &QFutureWatcher<void>::deleteLater);
auto future = QtConcurrent::run( [=]{ SomeFunc(); });
futureWatcher->setFuture(future);
}
如何正确更新进度条?
使用 signal/slot 组合,特别是排队连接类型 (Qt::ConnectionType)。因此,沿着这些思路:
void MainWindow::Somefunc()
{
emit computationProgress(progress);
}
void MainWindow::setProgress(int progress)
{
ui->progressBar->setValue(progress);
}
void MainWindow::on_pushButton_3_clicked()
{
auto futureWatcher = new QFutureWatcher<void>(this);
connect(futureWatcher, &QFutureWatcher<void>::finished, futureWatcher, &QFutureWatcher<void>::deleteLater);
auto future = QtConcurrent::run( [=]{ SomeFunc(); });
futureWatcher->setFuture(future);
connect(this, &MainWindow::computationProgress, this, &MainWindow::setProgress, Qt::QueuedConnection);
}
我开发了一个带有界面的qt程序。我还有一个复杂的计算,它是在 ui 线程的单独线程上完成的。我想从完成计算的线程更新进度条。但是我得到一个错误,我不能更改属于另一个线程的对象。
这是我的代码:
void Somefunc()
{
ui->progressBar->setValue(progress);
}
void MainWindow::on_pushButton_3_clicked()
{
auto futureWatcher = new QFutureWatcher<void>(this);
QObject::connect(futureWatcher, &QFutureWatcher<void>::finished, futureWatcher, &QFutureWatcher<void>::deleteLater);
auto future = QtConcurrent::run( [=]{ SomeFunc(); });
futureWatcher->setFuture(future);
}
如何正确更新进度条?
使用 signal/slot 组合,特别是排队连接类型 (Qt::ConnectionType)。因此,沿着这些思路:
void MainWindow::Somefunc()
{
emit computationProgress(progress);
}
void MainWindow::setProgress(int progress)
{
ui->progressBar->setValue(progress);
}
void MainWindow::on_pushButton_3_clicked()
{
auto futureWatcher = new QFutureWatcher<void>(this);
connect(futureWatcher, &QFutureWatcher<void>::finished, futureWatcher, &QFutureWatcher<void>::deleteLater);
auto future = QtConcurrent::run( [=]{ SomeFunc(); });
futureWatcher->setFuture(future);
connect(this, &MainWindow::computationProgress, this, &MainWindow::setProgress, Qt::QueuedConnection);
}