【问题标题】:QProgressBar updates as function progressQProgressBar 更新为函数进度
【发布时间】:2021-03-07 07:00:39
【问题描述】:

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

我想用“sleep_for”函数同化QProgressBar的进度。

当前代码:

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));
//StackOverFlow help me please


    EscreveVariavel(wEndereco, ifValor);

【问题讨论】:

    标签: c++ windows qt thread-sleep qprogressbar


    【解决方案1】:

    使用 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);
    }
    

    【讨论】:

      【解决方案2】:

      我不确定你对这种睡眠的意图:你是在模拟长时间的等待吗?在此过程中,您有关于进展的反馈吗?它是阻塞任务(如示例中所示)还是异步的?

      作为一个直接的答案(固定等待时间,阻塞),我认为创建一个具有较小睡眠的循环就足够了,例如:

      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 只能从主线程刷新。

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多