#include <QApplication>
#include <QLabel>
#include <QTimer>
class ProgressBarExample : public QObject
{
Q_OBJECT
public:
ProgressBarExample() : i(0)
{
// Create and configure the label
label = new QLabel();
label->setAlignment(Qt::AlignCenter);
label->setFixedSize(200, 30);
// Create the QTimer object and connect its timeout signal to the updateProgressBar slot
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &ProgressBarExample::updateProgressBar);
// Set the desired interval (in milliseconds) between updates
int interval = 100; // Adjust this value as per your requirement
timer->setInterval(interval);
// Start the timer
timer->start();
// Show the label
label->show();
}
private slots:
void updateProgressBar()
{
if (i > 100) {
// Stop the timer if the progress reaches 100%
timer->stop();
return;
}
QString data = QString::number(i);
label->setText(data + "%");
i++; // Increment the counter
}
private:
QLabel* label;
QTimer* timer;
int i;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ProgressBarExample example;
return app.exec();
}
#include "main.moc"
2条答案
按热度按时间axr492tv1#
要在每一步之间延迟更新进度条而不冻结GUI,您可以利用Qt的QTimer类来定期安排更新。
下面是一个例子:
ymdaylpp2#
来自QThread的Qt文档:
管理线程
注意:
wait()
和sleep()
函数通常是不必要的,因为Qt是一个事件驱动的框架。而不是wait()
,考虑监听finished()
信号。考虑使用QTimer
函数,而不是sleep()
函数。QThread::sleep:
如果需要等待给定条件更改,请避免使用此函数。相反,将一个插槽连接到指示更改的信号或使用事件处理程序。。
既然你的目标是:
我正在使用一个标签来打印0到100作为进度条的一部分
这里有两种方法可以做到这一点:
方案一:
您可以使用
QLabel
来模拟进度条,并通过使用QTimer
将其超时信号连接到lambda来增加标签本身显示的值,从而可以看到进度条的进展。我使用了
100ms
的超时,我正在循环进度,您可以通过在某些条件下使用QTimer::stop来调整它,使其停止在100。下面是一个最小可重复的示例:
它看起来是这样的:
方案二:
为了显示进度,Qt提供了QProgressBar,下面是你如何在上面的解决方案中使用它:
它看起来是这样的: