You mean you wish to have something that will notify you at given time?
This should work:
class AlarmClock
: public QObject {public:
public slots:
void start() {
if(m_timer!=0) return;
m_timer = startTimer(1000); // 1s resolution
}
void stop() {
if(m_timer==0) return;
killTimer(m_timer);
m_timer = 0;
}
QList<QDateTimer>::iterator iter = qLowerBound(m_alarms.begin(), m_alarms.end, dt);
if(*iter != dt) m_alarms.insert(iter, dt);
}
signals:
protected:
if(ev
->timerId
()!=m_timer
) { QObject::timerEvent(ev
);
return;
} while(m_alarms.first()<=current) {
emit alarm(m_alarms.first());
m_alarms.removeFirst();
}
}
private:
QList<QDateTime> m_alarms;
int m_timer;
};
class AlarmClock : public QObject {
public:
AlarmClock(QObject *parent = 0) : QObject(parent), m_timer(0) {}
public slots:
void start() {
if(m_timer!=0) return;
m_timer = startTimer(1000); // 1s resolution
}
void stop() {
if(m_timer==0) return;
killTimer(m_timer);
m_timer = 0;
}
void addAlarm(const QDateTime &dt) {
QList<QDateTimer>::iterator iter = qLowerBound(m_alarms.begin(), m_alarms.end, dt);
if(*iter != dt) m_alarms.insert(iter, dt);
}
signals:
void alarm(const QDateTime &dt);
protected:
void timerEvent(QTimerEvent *ev) {
if(ev->timerId()!=m_timer) { QObject::timerEvent(ev); return; }
QDateTime current = QDateTime::currentDateTime();
while(m_alarms.first()<=current) {
emit alarm(m_alarms.first());
m_alarms.removeFirst();
}
}
private:
QList<QDateTime> m_alarms;
int m_timer;
};
To copy to clipboard, switch view to plain text mode
AlarmClock *alarms = new AlarmClock(this);
alarms->start();
connect(alarms,
SIGNAL(alarm
(QDateTime)), ..., ...
);
AlarmClock *alarms = new AlarmClock(this);
alarms->addAlarm(QDateTime(QDate::currentDate(), QTime(10, 46, 53)));
alarms->start();
alarms->addAlarm(QDateTime(QDate::currentDate().addDays(1), QTime(9, 12, 00)));
connect(alarms, SIGNAL(alarm(QDateTime)), ..., ...);
To copy to clipboard, switch view to plain text mode
Bookmarks