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 只能从主线程刷新。
如何初始化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 只能从主线程刷新。