QT“滴答”小部件循环

时间:2019-02-18 09:05:16

标签: c++ qt loops qt5

我正在尝试了解在帧时更新窗口小部件的正确方法。 我要解决的特定问题是在标签上设置计时器的剩余时间。

我创建并启动了计时器

MainTimer = new QTimer(this);
MainTimer->setSingleShot(true);
MainTimer->start(5000);

在QML上,我有一个标签UI_MainTimerLabel,可以通过ui->UI_MainTimerLabel->setNum(int)访问。

由于QTimer不提供OnTimerUpdate信号或回调方法,因此我想必须创建某种循环来读取计时器的值并将其设置为标签。

我应该通过QThread吗?

QThread::create([&]() {
    while(true)
    {
        ui->UI_RemainingTimer->setNum(MainTimer->remainingTime());
    }
})->start();

(注意:我知道这行不通,但这不是问题,因为我只是想理解这个概念)

我应该使用0定时的QTimer吗?

UpdateTimer = new QTimer(this);
//{binding the UpdateTimer end signal to a ui->UI_RemainingTimer->SetNum(MainTimer->RemainingTimer() function}
UpdateTimer->start(0);

我应该使用QEventLoop(但是我还没有完全了解它们的正确用法)吗?

我应该使用用户创建的“ MyTimerLabel”小部件进行自我更新(使用哪种虚拟覆盖方法吗?)?

或者还有其他我无法理解的管理帧时更新的正确方法吗? (不过,我正在尝试获得一般正确的方法,而不是此特定问题的解决方法)

预先感谢

1 个答案:

答案 0 :(得分:0)

是否有必要随时更新GUI?不,每帧每30毫秒更新一次,因此适当的做法是更新该时间的一半,即15毫秒。因此,通过计算在GUI中显示的剩余时间,将第二个计时器设置为该时间段:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTimer main_timer;
    main_timer.setSingleShot(true);
    QTimer update_timer;
    QLabel label;
    label.setAlignment(Qt::AlignCenter);
    label.resize(640, 480);
    QObject::connect(&update_timer, &QTimer::timeout, [&main_timer, &update_timer, &label](){
        int rem = main_timer.remainingTime();
        if(rem <0){
            label.setNum(0);
            update_timer.stop();
        }
        else{
            label.setNum(rem);
        }
    });
    label.show();
    main_timer.start(5000);
    update_timer.start(15);
    return a.exec();
}