QT "Tick" цикл виджетов - PullRequest
       7

QT "Tick" цикл виджетов

0 голосов
/ 18 февраля 2019

Я пытаюсь понять правильный способ обновления виджета во время кадра.Конкретная проблема, которую я пытаюсь решить, - установить оставшееся время таймера на метке.

Я создал и запустил таймер

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 голосов
/ 18 февраля 2019

Нужно ли обновлять графический интерфейс в любой момент?Нет, каждый кадр обновляется каждые 30 мс, поэтому целесообразно обновить половину этого времени, то есть 15 мс.Таким образом, второй таймер устанавливается на этот период путем расчета оставшегося времени, отображая его в графическом интерфейсе:

#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();
}
...