QTimer: возможны ли «несколько тайм-аутов»? - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю простую игру, которая показывает обратный отсчет времени для пользователя, начиная с 1:00 и заканчивая обратным отсчетом до нуля.По достижении 0:00 я хочу отобразить сообщение типа «время истекло!».

В настоящее время у меня есть объект QTimer и QTime (QTime начинается с 00:01:00)

QTimer *timer=new QTimer();
QTime time{0,1,0};

В конструкторе я устанавливаю таймер на тайм-аут каждую 1 секунду, и он связан с событием, которое обновляет обратный отсчет на экране, который первоначально отображает таймер на 1: 00:

connect(timer, SIGNAL(timeout()), this, SLOT(updateCountDown()));
timer->start(1000);
ui->countdown->setText(time.toString("m:ss"));

Этот слот вызывается каждую 1 секунду:

void MainWindow::updateCountDown(){
    time=time.addSecs(-1);
    ui->countDown->setText(time.toString("m:ss"));
}

Теперь мне нужно иметь возможность вызывать новый метод всякий раз, когда QTime достигает 0:00.Я не очень заинтересован в добавлении if к методу updateCountdown, чтобы проверить, находится ли QTime в 0:00 каждую секунду.Я также подумал, может быть, я мог бы добавить второй QTimer, который истекает через 1 минуту, но я не уверен, будут ли оба объекта QTimer запускаться в одно и то же время, поэтому 1-минутный тайм-аут произойдет именно тогда, когда объект QTime будет в 0:00.

Так есть ли способ добавить второй тайм-аут к тому же объекту QTimer (тайм-аут один раз в секунду, чтобы обновить обратный отсчет на экране, а затем второй тайм-аут после 1 минуты, чтобы завершить игру? Я подозреваю,ответ будет «нет», но в таком случае какой подход будет наилучшим? (если ни один из моих вариантов не действителен, есть ли лучший способ сделать это?).

1 Ответ

0 голосов
/ 28 декабря 2018

Ответ на ваш первый вопрос - нет - QTimer поддерживает один тайм-аут (или один указанный интервал времени, если он не работает в режиме одиночной съемки).

Ответ на вашВторой вопрос - лучший подход - самый простой, который может сработать.Используйте один QTimer, и в свой метод updateCountdown() включите оператор if, чтобы сделать что-то другое, когда обратный отсчет наконец достигнет нуля.(Между прочим, вам не нужно использовать QTime объект для представления обратного отсчета; вы можете так же легко использовать int, который начинается с 60 и уменьшается до тех пор, пока не достигнет 0)

Почемуэто лучше / проще?Вместо этого вы могли бы использовать два QTimer объекта, но тогда вам нужно беспокоиться о том, чтобы синхронизировать их - возможно, это пока не сложно, но что происходит, когда вы хотите добавить кнопку «Пауза» в свою игру, иликогда вы хотите добавить бонус времени, который дает игроку 10 дополнительных секунд игрового времени?Внезапно ваш 60-секундный таймер перестанет работать правильно, и во всех случаях будет сложно остановить и перезапустить его правильно.

Если операторы предложения дешевы и их легкопонять / контроль / отладки;так что вы могли бы также использовать один.

...