15QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
16 const QObject *r,
const char *member)
17 : QObject(QAbstractEventDispatcher::instance())
19 connect(
this, SIGNAL(timeout()), r, member);
20 startTimerForReceiver(interval, timerType, r);
23QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
24 const QObject *r, QtPrivate::QSlotObjectBase *slotObj)
25 : QObject(QAbstractEventDispatcher::instance())
27 int signal_index = QMetaObjectPrivate::signalOffset(&staticMetaObject);
28 Q_ASSERT(QMetaObjectPrivate::signal(&staticMetaObject, signal_index).name() ==
"timeout");
29 QObjectPrivate::connectImpl(
this, signal_index, r ? r :
this,
nullptr, slotObj,
30 Qt::AutoConnection,
nullptr, &staticMetaObject);
32 startTimerForReceiver(interval, timerType, r);
42void QSingleShotTimer::startTimerForReceiver(Duration interval, Qt::TimerType timerType,
43 const QObject *receiver)
45 if (receiver && receiver->thread() != thread()) {
46 QObjectPrivate *d_ptr = QObjectPrivate::get(
this);
47 d_ptr->sendChildEvents =
false;
50 moveToThread(receiver->thread());
52 QCoreApplication::postEvent(
this,
53 new StartTimerEvent(
this, QDeadlineTimer(interval, timerType)));
57 timer.start(interval, timerType,
this);
67void QSingleShotTimer::timerEvent(QTimerEvent *event)
69 if (event->id() == Qt::TimerId::Invalid) {
70 StartTimerEvent *startTimerEvent =
static_cast<StartTimerEvent *>(event);
71 Q_UNUSED(startTimerEvent->timer.release());
72 const QDeadlineTimer &deadline = startTimerEvent->deadline;
73 if (deadline.hasExpired()) {
76 timer.start(deadline.remainingTimeAsDuration(), deadline.timerType(),
this);
78 setParent(QThread::currentThread()->eventDispatcher());