Всем привет.
Пытаюсь сделать приложение, которое обновляло бы QProgressBar в диалоге с помощью QFutureWatcher. Но ProgressBar не обновляется.
При этом если не использовать QProgressBar, а заменить его на QProgressDialog все работает. Думаю, собака зарыта в некоректной обработке сигналов.
Может кто-нибудь сталкивался с такой проблемой?
Код:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
auto* progress = ui->progressBar;
QObject::connect(&futureWatcher, &QFutureWatcher<void>::finished, progress, &QProgressBar::reset);
QObject::connect(ui->stopBtn, &QPushButton::clicked, &futureWatcher, &QFutureWatcher<void>::cancel);
QObject::connect(&futureWatcher, &QFutureWatcher<void>::progressRangeChanged, progress, &QProgressBar::setRange);
QObject::connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, progress, &QProgressBar::setValue);
}
std::function<void(int&)> spin = [](int& iter) {
const int work = 1000 * 1000 * 40;
volatile int v = 0;
for (int j = 0; j < work; ++j)
++v;
qDebug() << "iteration " << iter << " in thread" << QThread::currentThreadId();
};
void MainWindow::on_startButton_clicked()
{
for (int i =0; i < 200; i++)
m_list.push_back(i);
qDebug() << QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount());
m_fututre = QtConcurrent::map(m_list, spin);
futureWatcher.setFuture(m_fututre);
}