Название: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 03:52 Добрый день!
подскажите, пожалуйста, как прикрутить будильник в данной программе? перепробовал разные варианты, пытался всунуть QTimer::singleshot в метод getAlarmTime, но, однако, не получается :( По идее, нужна ежесекундная проверка на соответствие текущего времени заданному пользователем, но никак не могу додуматься, как это реализовать ... widget.cpp Код: #include <QtGui> PS. Да, исполнение задания времени будильника крайне халтурно, но ничего не поделать, я слишком новичок.. Название: Re: Вопрос по реализации будильника в программе Отправлено: ритт от Июнь 07, 2009, 04:55 слабенько, слабенько...не вижу даже установки таймера.
а в остальном - всё довольно примитивно - я бы сделал циклический таймер и по таймауту сравнивал бы текущее время с предустаноленным. таким макаром в будущем можно завести множество будильников на одном таймере. секундный таймаут имело бы устанавливать только для ежесекундного обновления счётчика (или часов); либо же можно ограничиться интервалом порядка, скажем, 10-20 секунд... Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 06:31 слабенько, слабенько...не вижу даже установки таймера. а в остальном - всё довольно примитивно - я бы сделал циклический таймер и по таймауту сравнивал бы текущее время с предустаноленным. таким макаром в будущем можно завести множество будильников на одном таймере. секундный таймаут имело бы устанавливать только для ежесекундного обновления счётчика (или часов); либо же можно ограничиться интервалом порядка, скажем, 10-20 секунд... Спасибо за ответ На самом деле, делал уже вот так: Код: void Timer::playAlarm() Но, по окончанию работы таймера слот playAlarm() никак не хочет вызываться. Не пойму совершенно, что не так =\ Название: Re: Вопрос по реализации будильника в программе Отправлено: lit-uriy от Июнь 07, 2009, 08:33 Посмотри пример: %QTDIR%\examples\widgets\analogclock
там таймер каждую секунду перерисовывает часы. Ну а ты будешь вместо перерисовки исполнять какие-то действия. Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 13:34 Посмотри пример: %QTDIR%\examples\widgets\analogclock там таймер каждую секунду перерисовывает часы. Ну а ты будешь вместо перерисовки исполнять какие-то действия. простите, а чем отличается таймер аналоговых часов в экзампле Код: QTimer *timer = new QTimer(this); от написанного в конструкторе (см. первый пост) Код: QObject::connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); я уже пробовал вместо QTime::singleShot запускать отдельный таймер, типа Код:
но после задания желаемого времени будильника приложение "неожиданно закрывается", т.е., по видимому, сегфолт.. Название: Re: Вопрос по реализации будильника в программе Отправлено: lit-uriy от Июнь 07, 2009, 15:38 >>простите, а чем отличается таймер аналоговых часов в экзампле
тем, что в примере ему начзначается родитель, и после удаления родителя, его детё (таймер) будет тоже удалено. Т.е. высвободится память. >>приложение "неожиданно закрывается" Закоментируй весь код в слоте, и проверь как программа себя вести будет. Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 17:03 >>приложение "неожиданно закрывается" Закоментируй весь код в слоте, и проверь как программа себя вести будет. Код: void Timer::playAlarm() если это то, что вы имели ввиду, то ничего ровным счетом не изменилось. Название: Re: Вопрос по реализации будильника в программе Отправлено: igor_bogomolov от Июнь 07, 2009, 17:07 Timer::Timer() QObject::connect(alarm_timer, SIGNAL(timeout()), this, SLOT(playAlarm())); Сигналы и слоты (http://www.doc.crossplatform.ru/qt/4.4.3/signalsandslots.html#a-small-example) Цитировать Все классы, содержащие сигналы и слоты, должны упомянуть макрос Q_OBJECT в начале своей декларации. Также они должны происходить (прямо или косвенно) от QObject. Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 17:29 Timer::Timer() QObject::connect(alarm_timer, SIGNAL(timeout()), this, SLOT(playAlarm())); Сигналы и слоты (http://www.doc.crossplatform.ru/qt/4.4.3/signalsandslots.html#a-small-example) Цитировать Все классы, содержащие сигналы и слоты, должны упомянуть макрос Q_OBJECT в начале своей декларации. Также они должны происходить (прямо или косвенно) от QObject. Если я вас правильно понял, то это есть: widget.h Код: class Timer : public QWidget Название: Re: Вопрос по реализации будильника в программе Отправлено: igor_bogomolov от Июнь 07, 2009, 17:52 Попробуй немного переделать конструктор класса
Код
Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 18:03 Попробуй немного переделать конструктор класса Код
переделал: widget.h Код
widget.cpp Код
Код
программа на синглшот все еще не реагирует вообще никак, а если использовать обычный таймер - опять же вылетает. Название: Re: Вопрос по реализации будильника в программе Отправлено: igor_bogomolov от Июнь 07, 2009, 18:08 Если хочешь, приатач проект, я посмотрю что не так
Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 18:13 Если хочешь, приатач проект, я посмотрю что не так ну, вот... Спасибо вам большое заранее ;) Название: Re: Вопрос по реализации будильника в программе Отправлено: sLiva от Июнь 07, 2009, 18:56 Если хочешь, приатач проект, я посмотрю что не так ну, вот... Спасибо вам большое заранее ;) Глубоко не смотрел но сразу же дебагом увидел неправильный расчет задержки delay, которая при задание будильника на минуту показывает delay_minute = 34, delay = 71580000 Проверяй расчет задержки... Название: Re: Вопрос по реализации будильника в програ& Отправлено: igor_bogomolov от Июнь 07, 2009, 18:57 Ну ты конечно начудил с расчетом времени. Текущее время 19,30. Завожу на 19,31. deley = 70260000 :o
Подправил тебе. Диалог выбора времени сам доделаешь, идея и так должна быть понятна. Сейчас выставляешь требуемое время, и нажимаешь крестик. В нужное время будильник сработает :) --- Да, расчет паузы тоже сам доделаешь. Сейчас можно менять только секунды. Пользуйся QTimeEdit Название: Re: Вопрос по реализации будильника в программе Отправлено: igor_bogomolov от Июнь 07, 2009, 19:10 Ошибся я слегка. Замени
int delay = alarm.msecsTo(QTime::currentTime()); на int delay = QTime::currentTime().msecsTo(alarm); и все должно быть нормально для любого времени :) Название: Re: Вопрос по реализации будильника в программе Отправлено: Noir от Июнь 07, 2009, 19:18 Ошибся я слегка. Замени int delay = alarm.msecsTo(QTime::currentTime()); на int delay = QTime::currentTime().msecsTo(alarm); и все должно быть нормально для любого времени :) поправил уже сам, когда увидел в дебаге отрицательные числа :) спасибо вам большое за помощь, all works! =) |