14QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
15 const QObject *r,
const char *member)
16 : QObject(QAbstractEventDispatcher::instance())
18 connect(
this, SIGNAL(timeout()), r, member);
19 startTimerForReceiver(interval, timerType, r);
22QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
23 const QObject *r, QtPrivate::QSlotObjectBase *slotObj)
24 : QObject(QAbstractEventDispatcher::instance())
26 int signal_index = QMetaObjectPrivate::signalOffset(&staticMetaObject);
27 Q_ASSERT(QMetaObjectPrivate::signal(&staticMetaObject, signal_index).name() ==
"timeout");
28 QObjectPrivate::connectImpl(
this, signal_index, r ? r :
this,
nullptr, slotObj,
29 Qt::AutoConnection,
nullptr, &staticMetaObject);
31 startTimerForReceiver(interval, timerType, r);
41void QSingleShotTimer::startTimerForReceiver(Duration interval, Qt::TimerType timerType,
42 const QObject *receiver)
44 if (receiver && receiver->thread() != thread()) {
45 QObjectPrivate *d_ptr = QObjectPrivate::get(
this);
46 d_ptr->sendChildEvents =
false;
49 moveToThread(receiver->thread());
51 QCoreApplication::postEvent(
this,
52 new StartTimerEvent(
this, QDeadlineTimer(interval, timerType)));
56 timer.start(interval, timerType,
this);
66void QSingleShotTimer::timerEvent(QTimerEvent *event)
68 if (event->id() == Qt::TimerId::Invalid) {
69 StartTimerEvent *startTimerEvent =
static_cast<StartTimerEvent *>(event);
70 Q_UNUSED(startTimerEvent->timer.release());
71 const QDeadlineTimer &deadline = startTimerEvent->deadline;
72 if (deadline.hasExpired()) {
75 timer.start(deadline.remainingTimeAsDuration(), deadline.timerType(),
this);
77 setParent(QThread::currentThread()->eventDispatcher());