QProgressBar 随着功能的进步而更新

QProgressBar updates as function progress

如何初始化QProgressBar的操作,我已经声明了她的最大值,最小值,范围和值。

我想将QProgressBar的进度同化为“sleep_for”函数

当前代码:

void MainPrograma::on_pushCorre_clicked()
{
    QPlainTextEdit *printNaTela = ui->plainTextEdit;
    printNaTela->moveCursor(QTextCursor::End);
    printNaTela->insertPlainText("corrida iniciada\n");

    QProgressBar *progresso = ui->progressBar;
    progresso->setMaximum(100);
    progresso->setMinimum(0);
    progresso->setRange(0, 100);
    progresso->setValue(0);
    progresso->show();

    WORD wEndereco = 53606;
    WORD wValor = 01;
    WORD ifValor = 0;
    EscreveVariavel(wEndereco, wValor);


//How to assimilate QProgressBar to this function:
std::this_thread::sleep_for(std::chrono::milliseconds(15000));
//Whosebug help me please


    EscreveVariavel(wEndereco, ifValor);

使用 QTimer

并在插槽中更新进度条的值

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    t = new QTimer(this);
    t->setSingleShot(false);
    c = 0;
    connect(t, &QTimer::timeout, [this]()
    {   c++;
        if (c==100) {
            c=0;
        }
        qDebug() << "T...";
        ui->progressBar->setValue(c);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    t->start(100);
}

我不确定你这样睡的意图:你是在模拟漫长的等待吗?你对这个过程中的进展有反馈吗?它是阻塞任务(如示例中所示)还是异步的?

作为一个直接的答案(固定的等待时间,阻塞)我认为做一个睡眠时间更短的循环就足够了,比如:

EscreveVariavel(wEndereco, wValor);
for (int ii = 0; ii < 100; ++ii) {
   progresso->setValue(ii);
   qApp->processEvents(); // necessary to update the UI
   std::this_thread::sleep_for(std::chrono::milliseconds(150));
}
EscreveVariavel(wEndereco, ifValor);

请注意,由于线程调度和 UI 刷新,您可能会等待更多时间。

对于异步任务,您应该传递要更新的进度条,或执行此类更新的某种回调。请记住 UI 只能从主线程刷新。