se-6ren">
gpt4 book ai didi

c++ - QT "Tick"小部件循环

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:50 25 4
gpt4 key购买 nike

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

我创建并启动了计时器

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-timer QTimer 吗?

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

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

我应该使用用户创建的 self 更新的“MyTimerLabel”小部件(在哪个虚拟覆盖方法中?)?

或者还有其他一些我无法理解的管理帧时间更新的正确方法吗? (虽然我试图获得一般正确的方法,而不是这个特定问题的解决方法)

提前致谢

最佳答案

是否有必要每时每刻更新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();
}

关于c++ - QT "Tick"小部件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54743655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com