Qt 6.x
The Qt SDK
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
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
\inmodule QtCore
Definition qobject.h:90
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:1363
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.
double e
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
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent