c++ 如何降低标签上打印进度值的速度?

idv4meu8  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(616)

我使用标签打印0到100作为Qt C++中进度条的一部分。我使用下面的代码来做,但它执行得太快了:

for (i = 0; i <= 100; i++)
{
    data = QString::number(i);
    ui->label_29->setText(data + "%");
}

我尝试使用sleep()函数,但它冻结了exe文件,无法运行。我想用一根线,但我不知道怎么做。

axr492tv

axr492tv1#

要在每一步之间延迟更新进度条而不冻结GUI,您可以利用Qt的QTimer类来定期安排更新。
下面是一个例子:

#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"
ymdaylpp

ymdaylpp2#

来自QThread的Qt文档:
管理线程
注意:wait()sleep()函数通常是不必要的,因为Qt是一个事件驱动的框架。而不是wait(),考虑监听finished()信号。考虑使用QTimer函数,而不是sleep()函数。
QThread::sleep:
如果需要等待给定条件更改,请避免使用此函数。相反,将一个插槽连接到指示更改的信号或使用事件处理程序。。
既然你的目标是:
我正在使用一个标签来打印0到100作为进度条的一部分
这里有两种方法可以做到这一点:

方案一:

您可以使用QLabel来模拟进度条,并通过使用QTimer将其超时信号连接到lambda来增加标签本身显示的值,从而可以看到进度条的进展。
我使用了100ms的超时,我正在循环进度,您可以通过在某些条件下使用QTimer::stop来调整它,使其停止在100。
下面是一个最小可重复的示例:

#include <QApplication>
#include <QTimer>
#include <QLabel>

int main(int argc,char*argv[])
{
    QApplication a(argc, argv);

    QLabel *l = new QLabel();
    l->setText("0");
    l->setAlignment(Qt::AlignCenter);

    QTimer *t = new QTimer();

    t->connect(t,&QTimer::timeout,[=]()
    {
        l->setText(QString::number((l->text().toInt()+1)%100));
    });

    t->start(100);

    l->show();

    return a.exec();
}

它看起来是这样的:

方案二:

为了显示进度,Qt提供了QProgressBar,下面是你如何在上面的解决方案中使用它:

#include <QApplication>
#include <QProgressBar>
#include <QTimer>

int main(int argc,char*argv[])
{
    QApplication a(argc, argv);

    QProgressBar *p = new QProgressBar();

    p->setRange(0,100);

    p->setValue(0);

    p->setOrientation(Qt::Horizontal);

    QTimer *t = new QTimer();

    t->connect(t,&QTimer::timeout,[=]()
    {
        p->setValue((p->value()+1)%p->maximum());
    });

    t->start(100);

    p->show();

    return a.exec();
}

它看起来是这样的:

相关问题