Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmltimer.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmltimer_p.h"
5
6#include <QtCore/qcoreapplication.h>
7#include "private/qpauseanimationjob_p.h"
8#include <qdebug.h>
9
10#include <private/qobject_p.h>
11
13
14namespace {
17}
18
20{
21 Q_DECLARE_PUBLIC(QQmlTimer)
22public:
26
29
30 void maybeTick() {
31 Q_Q(QQmlTimer);
32 if (!awaitingTick) {
33 awaitingTick = true;
34 QCoreApplication::postEvent(q, new QEvent(QEvent_MaybeTick));
35 }
36 }
37
38 int interval = 1000;
40 bool running : 1;
41 bool repeating : 1;
43 bool classBegun : 1;
45 bool firstTick : 1;
46 bool awaitingTick : 1;
47};
48
90 : QObject(*(new QQmlTimerPrivate), parent)
91{
92 Q_D(QQmlTimer);
93 d->pause.addAnimationChangeListener(d, QAbstractAnimationJob::Completion | QAbstractAnimationJob::CurrentLoop);
94 d->pause.setLoopCount(1);
95 d->pause.setDuration(d->interval);
96}
97
105void QQmlTimer::setInterval(int interval)
106{
107 Q_D(QQmlTimer);
108 if (interval != d->interval) {
109 d->interval = interval;
110 update();
112 }
113}
114
116{
117 Q_D(const QQmlTimer);
118 return d->interval;
119}
120
133{
134 Q_D(const QQmlTimer);
135 return d->running;
136}
137
139{
140 Q_D(QQmlTimer);
141 if (d->running != running) {
142 d->running = running;
143 d->firstTick = true;
145 update();
146 }
147}
148
161{
162 Q_D(const QQmlTimer);
163 return d->repeating;
164}
165
166void QQmlTimer::setRepeating(bool repeating)
167{
168 Q_D(QQmlTimer);
169 if (repeating != d->repeating) {
170 d->repeating = repeating;
171 update();
173 }
174}
175
194{
195 Q_D(const QQmlTimer);
196 return d->triggeredOnStart;
197}
198
199void QQmlTimer::setTriggeredOnStart(bool triggeredOnStart)
200{
201 Q_D(QQmlTimer);
202 if (d->triggeredOnStart != triggeredOnStart) {
203 d->triggeredOnStart = triggeredOnStart;
204 update();
206 }
207}
208
217{
218 setRunning(true);
219}
220
229{
230 setRunning(false);
231}
232
242{
243 setRunning(false);
244 setRunning(true);
245}
246
247void QQmlTimer::update()
248{
249 Q_D(QQmlTimer);
250 if (d->classBegun && !d->componentComplete)
251 return;
252 d->pause.stop();
253 if (d->running) {
254 d->pause.setCurrentTime(0);
255 d->pause.setLoopCount(d->repeating ? -1 : 1);
256 d->pause.setDuration(d->interval);
257 d->pause.start();
258 if (d->triggeredOnStart && d->firstTick)
259 d->maybeTick();
260 }
261}
262
264{
265 Q_D(QQmlTimer);
266 d->classBegun = true;
267}
268
270{
271 Q_D(QQmlTimer);
272 d->componentComplete = true;
273 update();
274}
275
281void QQmlTimer::ticked()
282{
283 Q_D(QQmlTimer);
284 if (d->running && (d->pause.currentTime() > 0 || (d->triggeredOnStart && d->firstTick)))
285 emit triggered();
286 d->firstTick = false;
287}
288
293{
294 Q_D(QQmlTimer);
295 if (e->type() == QEvent_MaybeTick) {
296 d->awaitingTick = false;
297 ticked();
298 return true;
299 } else if (e->type() == QEvent_Triggered) {
300 if (d->running && d->pause.isStopped()) {
301 d->running = false;
302 emit triggered();
304 }
305 return true;
306 }
307 return QObject::event(e);
308}
309
311{
312 Q_Q(QQmlTimer);
313 if (repeating || !running)
314 return;
315 firstTick = false;
316 QCoreApplication::postEvent(q, new QEvent(QEvent_Triggered));
317}
318
320
321#include "moc_qqmltimer_p.cpp"
static void postEvent(QObject *receiver, QEvent *event, int priority=Qt::NormalEventPriority)
\inmodule QtCore
Definition qcoreevent.h:45
Type
This enum type defines the valid event types in Qt.
Definition qcoreevent.h:51
Type type() const
Returns the event type.
Definition qcoreevent.h:304
\inmodule QtCore
Definition qobject.h:103
virtual bool event(QEvent *event)
This virtual function receives events to an object and should return true if the event e was recogniz...
Definition qobject.cpp:1389
void animationCurrentLoopChanged(QAbstractAnimationJob *) override
Definition qqmltimer.cpp:28
void animationFinished(QAbstractAnimationJob *) override
QPauseAnimationJob pause
Definition qqmltimer.cpp:39
void triggered()
void setInterval(int interval)
\qmlproperty int QtQml::Timer::interval
void stop()
\qmlmethod QtQml::Timer::stop()
QQmlTimer(QObject *parent=nullptr)
\qmltype Timer \instantiates QQmlTimer \inqmlmodule QtQml
Definition qqmltimer.cpp:89
void intervalChanged()
void triggeredOnStartChanged()
bool isRepeating() const
\qmlproperty bool QtQml::Timer::repeat
void classBegin() override
Invoked after class creation, but before any properties have been set.
void setRunning(bool running)
void start()
\qmlmethod QtQml::Timer::start()
void repeatChanged()
bool triggeredOnStart
Definition qqmltimer_p.h:37
void restart()
\qmlmethod QtQml::Timer::restart()
bool running
Definition qqmltimer_p.h:35
bool event(QEvent *) override
bool isRunning() const
\qmlproperty bool QtQml::Timer::running
void setTriggeredOnStart(bool triggeredOnStart)
void runningChanged()
void setRepeating(bool repeating)
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
Combined button and popup list for selecting options.
const QEvent::Type QEvent_Triggered
Definition qqmltimer.cpp:16
const QEvent::Type QEvent_MaybeTick
Definition qqmltimer.cpp:15
static Q_CONSTINIT QBasicAtomicInt running
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
#define emit