Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Андрей от Август 10, 2021, 10:11



Название: QFutureWatcher and QProgressBar
Отправлено: Андрей от Август 10, 2021, 10:11
Всем привет.
Пытаюсь сделать приложение, которое обновляло бы 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);
}


Название: Re: QFutureWatcher and QProgressBar
Отправлено: tux от Август 10, 2021, 10:14
Вы бы хоть пример кода привели.


Название: Re: QFutureWatcher and QProgressBar
Отправлено: Андрей от Август 10, 2021, 10:41
Вы бы хоть пример кода привели.

Да, не подумал.
Добавил пример кода :)