summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/declarative/anchor-layout.qdoc2
-rw-r--r--doc/src/declarative/focus.qdoc2
-rw-r--r--doc/src/declarative/qmlintro.qdoc1
-rw-r--r--doc/src/declarative/tutorial2.qdoc2
-rw-r--r--examples/declarative/dial/dial.pro9
-rw-r--r--examples/declarative/dial/dial.qrc10
-rw-r--r--examples/declarative/dial/main.cpp18
-rw-r--r--src/declarative/QmlChanges.txt1
-rw-r--r--src/declarative/fx/qfxtextedit.cpp14
-rw-r--r--src/declarative/fx/qfxtextedit.h6
-rw-r--r--src/declarative/fx/qfxtextedit_p.h4
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp38
-rw-r--r--src/declarative/util/qmltimer.cpp16
-rw-r--r--tests/auto/declarative/declarative.pro5
-rw-r--r--tests/auto/declarative/qmltimer/qmltimer.pro5
-rw-r--r--tests/auto/declarative/qmltimer/tst_qmltimer.cpp141
16 files changed, 236 insertions, 38 deletions
diff --git a/doc/src/declarative/anchor-layout.qdoc b/doc/src/declarative/anchor-layout.qdoc
index e723d5c..8590aba 100644
--- a/doc/src/declarative/anchor-layout.qdoc
+++ b/doc/src/declarative/anchor-layout.qdoc
@@ -14,7 +14,7 @@ Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; ... }
\endcode
-In this case, the left edge of \e rect2 is bound to the right edge of rect1, producing the following:
+In this case, the left edge of \e rect2 is bound to the right edge of \e rect1, producing the following:
\image edge1.png
diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc
index 1e00bd9..14bebb1 100644
--- a/doc/src/declarative/focus.qdoc
+++ b/doc/src/declarative/focus.qdoc
@@ -17,7 +17,7 @@ When the user presses or releases a key, the following occurs:
\o The key event is delivered by the scene to the QML \l Item with \e {active focus}. If no \l Item has \e {active focus}, the key event is \l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
\o If the QML \l Item with \e {active focus} accepts the key event, propagation stops. Otherwise the event is "bubbled up", by recursively passing it to each \l Item's parent until either the event is accepted, or the root \l Item is reached.
-If the \c {Rect} element in the following example has active focus and the \e A key is pressed, it will bubble up to the \c {KeyActions}. However, pressing the \e B key will bubble up to the root item and thus subsequently be \l {QEvent::ignore()}{ignored}.
+If the \c {Rectangle} element in the following example has active focus and the \e A key is pressed, it will bubble up to the \c {KeyActions}. However, pressing the \e B key will bubble up to the root item and thus subsequently be \l {QEvent::ignore()}{ignored}.
\code
Item {
diff --git a/doc/src/declarative/qmlintro.qdoc b/doc/src/declarative/qmlintro.qdoc
index cfefdb9..56cc804 100644
--- a/doc/src/declarative/qmlintro.qdoc
+++ b/doc/src/declarative/qmlintro.qdoc
@@ -124,6 +124,7 @@ In the above example, the Text object will have normal opacity, since the
line opacity: 0.5 has been turned into a comment.
\section1 Properties
+\target intro-properties
\section2 Property naming
diff --git a/doc/src/declarative/tutorial2.qdoc b/doc/src/declarative/tutorial2.qdoc
index a3154de..796d0f9 100644
--- a/doc/src/declarative/tutorial2.qdoc
+++ b/doc/src/declarative/tutorial2.qdoc
@@ -30,7 +30,7 @@ An \l Item is the most basic visual element in QML and is often used as a contai
We declare a \c color property. This property is accessible from \e outside our component, this allows us
to instantiate the cells with different colors.
-This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{Properties}).
+This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{intro-properties}{Properties}).
\snippet examples/declarative/tutorials/helloworld/Cell.qml 5
diff --git a/examples/declarative/dial/dial.pro b/examples/declarative/dial/dial.pro
new file mode 100644
index 0000000..1d1f811
--- /dev/null
+++ b/examples/declarative/dial/dial.pro
@@ -0,0 +1,9 @@
+SOURCES = main.cpp
+RESOURCES = dial.qrc
+
+QT += script declarative
+
+target.path = $$[QT_INSTALL_EXAMPLES]/declarative/dial
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS dial.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/declarative/dial
+INSTALLS += target sources
diff --git a/examples/declarative/dial/dial.qrc b/examples/declarative/dial/dial.qrc
new file mode 100644
index 0000000..77354c0
--- /dev/null
+++ b/examples/declarative/dial/dial.qrc
@@ -0,0 +1,10 @@
+<RCC>
+ <qresource prefix="/">
+ <file>DialLibrary/background.png</file>
+ <file>DialLibrary/overlay.png</file>
+ <file>DialLibrary/needle_shadow.png</file>
+ <file>DialLibrary/needle.png</file>
+ <file>DialLibrary/Dial.qml</file>
+ <file>dial.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/declarative/dial/main.cpp b/examples/declarative/dial/main.cpp
new file mode 100644
index 0000000..b65c9ff
--- /dev/null
+++ b/examples/declarative/dial/main.cpp
@@ -0,0 +1,18 @@
+#include <QApplication>
+#include <QUrl>
+#include <qmlview.h>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ QmlView *canvas = new QmlView;
+ canvas->setUrl(QUrl("qrc:/dial.qml"));
+ canvas->execute();
+ canvas->resize(210,240);
+ canvas->show();
+
+ return app.exec();
+}
+
+
diff --git a/src/declarative/QmlChanges.txt b/src/declarative/QmlChanges.txt
index 7661e03..ee5acd4 100644
--- a/src/declarative/QmlChanges.txt
+++ b/src/declarative/QmlChanges.txt
@@ -41,6 +41,7 @@ Text elements: hAlign -> horizontalAlignment
Text elements: vAlign -> verticalAlignment
Text elements: highlightColor -> selectionColor
Text elements: highlightedTextColor -> selectedTextColor
+Text elements: preserveSelection -> persistentSelection
State: operations -> changes
Transition: operations -> animations
Transition: fromState -> from
diff --git a/src/declarative/fx/qfxtextedit.cpp b/src/declarative/fx/qfxtextedit.cpp
index f4c2e4c..07444bb 100644
--- a/src/declarative/fx/qfxtextedit.cpp
+++ b/src/declarative/fx/qfxtextedit.cpp
@@ -407,7 +407,7 @@ void QFxTextEdit::setCursorVisible(bool on)
return;
d->cursorVisible = on;
QFocusEvent focusEvent(on ? QEvent::FocusIn : QEvent::FocusOut);
- if (!on && !d->preserveSelection)
+ if (!on && !d->persistentSelection)
d->control->setCursorIsFocusIndicator(true);
d->control->processEvent(&focusEvent, QPointF(0, 0));
}
@@ -590,23 +590,23 @@ void QFxTextEdit::setFocusOnPress(bool on)
}
/*!
- \qmlproperty bool TextEdit::preserveSelection
+ \qmlproperty bool TextEdit::persistentSelection
Whether the TextEdit should keep the selection visible when it loses focus to another
item in the scene. By default this is set to true;
*/
-bool QFxTextEdit::preserveSelection() const
+bool QFxTextEdit::persistentSelection() const
{
Q_D(const QFxTextEdit);
- return d->preserveSelection;
+ return d->persistentSelection;
}
-void QFxTextEdit::setPreserveSelection(bool on)
+void QFxTextEdit::setPersistentSelection(bool on)
{
Q_D(QFxTextEdit);
- if (d->preserveSelection == on)
+ if (d->persistentSelection == on)
return;
- d->preserveSelection = on;
+ d->persistentSelection = on;
}
qreal QFxTextEdit::textMargin() const
diff --git a/src/declarative/fx/qfxtextedit.h b/src/declarative/fx/qfxtextedit.h
index 1a5d968..f4f101a 100644
--- a/src/declarative/fx/qfxtextedit.h
+++ b/src/declarative/fx/qfxtextedit.h
@@ -83,7 +83,7 @@ class Q_DECLARATIVE_EXPORT QFxTextEdit : public QFxPaintedItem
Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged)
Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectionChanged)
Q_PROPERTY(bool focusOnPress READ focusOnPress WRITE setFocusOnPress)
- Q_PROPERTY(bool preserveSelection READ preserveSelection WRITE setPreserveSelection)
+ Q_PROPERTY(bool persistentSelection READ persistentSelection WRITE setPersistentSelection)
Q_PROPERTY(qreal textMargin READ textMargin WRITE setTextMargin)
public:
@@ -154,8 +154,8 @@ public:
bool focusOnPress() const;
void setFocusOnPress(bool on);
- bool preserveSelection() const;
- void setPreserveSelection(bool on);
+ bool persistentSelection() const;
+ void setPersistentSelection(bool on);
qreal textMargin() const;
void setTextMargin(qreal margin);
diff --git a/src/declarative/fx/qfxtextedit_p.h b/src/declarative/fx/qfxtextedit_p.h
index 9c73db9..82481ff 100644
--- a/src/declarative/fx/qfxtextedit_p.h
+++ b/src/declarative/fx/qfxtextedit_p.h
@@ -70,7 +70,7 @@ public:
QFxTextEditPrivate()
: color("black"), imgDirty(true), hAlign(QFxTextEdit::AlignLeft), vAlign(QFxTextEdit::AlignTop),
dirty(false), wrap(false), richText(false), cursorVisible(false), focusOnPress(false),
- preserveSelection(true), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0),
+ persistentSelection(true), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0),
cursorComponent(0), cursor(0), format(QFxTextEdit::AutoText), document(0)
{
}
@@ -98,7 +98,7 @@ public:
bool richText;
bool cursorVisible;
bool focusOnPress;
- bool preserveSelection;
+ bool persistentSelection;
qreal textMargin;
int lastSelectionStart;
int lastSelectionEnd;
diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp
index fb1cfcf..b7248ea 100644
--- a/src/declarative/fx/qfxvisualitemmodel.cpp
+++ b/src/declarative/fx/qfxvisualitemmodel.cpp
@@ -264,10 +264,10 @@ public:
}
if (m_roles.count() == 1)
m_roleNames.insert(QLatin1String("modelData"), m_roles.at(0));
- } else if (m_modelList) {
+ } else if (m_listAccessor) {
m_roleNames.insert(QLatin1String("modelData"), 0);
- if (m_modelList->type() == QmlListAccessor::Instance) {
- if (QObject *object = m_modelList->at(0).value<QObject*>()) {
+ if (m_listAccessor->type() == QmlListAccessor::Instance) {
+ if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
int count = object->metaObject()->propertyCount();
for (int ii = 1; ii < count; ++ii) {
const QMetaProperty &prop = object->metaObject()->property(ii);
@@ -330,7 +330,7 @@ public:
QFxVisualDataModelData *data(QObject *item);
QVariant m_modelVariant;
- QmlListAccessor *m_modelList;
+ QmlListAccessor *m_listAccessor;
int modelCount() const {
if (m_visualItemModel)
@@ -339,8 +339,8 @@ public:
return m_listModelInterface->count();
if (m_abstractItemModel)
return m_abstractItemModel->rowCount();
- if (m_modelList)
- return m_modelList->count();
+ if (m_listAccessor)
+ return m_listAccessor->count();
return 0;
}
};
@@ -405,7 +405,7 @@ int QFxVisualDataModelDataMetaObject::createProperty(const char *name, const cha
static_cast<QFxVisualDataModelData *>(object());
if ((!data->m_model->m_listModelInterface || !data->m_model->m_abstractItemModel)
- && data->m_model->m_modelList) {
+ && data->m_model->m_listAccessor) {
data->m_model->ensureRoles();
if (data->m_model->m_roleNames.contains(QLatin1String(name)))
return QmlOpenMetaObject::createProperty(name, type);
@@ -427,16 +427,16 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
static_cast<QFxVisualDataModelData *>(object());
QString name = QLatin1String(prop.name());
if ((!data->m_model->m_listModelInterface || !data->m_model->m_abstractItemModel)
- && data->m_model->m_modelList) {
+ && data->m_model->m_listAccessor) {
if (name == QLatin1String("modelData")) {
- if (data->m_model->m_modelList->type() == QmlListAccessor::Instance) {
- QObject *object = data->m_model->m_modelList->at(0).value<QObject*>();
+ if (data->m_model->m_listAccessor->type() == QmlListAccessor::Instance) {
+ QObject *object = data->m_model->m_listAccessor->at(0).value<QObject*>();
return object->metaObject()->property(1).read(object); // the first property after objectName
}
- return data->m_model->m_modelList->at(data->m_index);
+ return data->m_model->m_listAccessor->at(data->m_index);
} else {
// return any property of a single object instance.
- QObject *object = data->m_model->m_modelList->at(0).value<QObject*>();
+ QObject *object = data->m_model->m_listAccessor->at(0).value<QObject*>();
return object->property(prop.name());
}
} else if (data->m_model->m_listModelInterface) {
@@ -531,7 +531,7 @@ QFxVisualDataModelParts::QFxVisualDataModelParts(QFxVisualDataModel *parent)
QFxVisualDataModelPrivate::QFxVisualDataModelPrivate(QmlContext *ctxt)
: m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
-, m_context(ctxt), m_parts(0), m_modelList(0)
+, m_context(ctxt), m_parts(0), m_listAccessor(0)
{
}
@@ -556,8 +556,8 @@ QFxVisualDataModel::QFxVisualDataModel(QmlContext *ctxt)
QFxVisualDataModel::~QFxVisualDataModel()
{
Q_D(QFxVisualDataModel);
- if (d->m_modelList)
- delete d->m_modelList;
+ if (d->m_listAccessor)
+ delete d->m_listAccessor;
}
QVariant QFxVisualDataModel::model() const
@@ -569,8 +569,8 @@ QVariant QFxVisualDataModel::model() const
void QFxVisualDataModel::setModel(const QVariant &model)
{
Q_D(QFxVisualDataModel);
- delete d->m_modelList;
- d->m_modelList = 0;
+ delete d->m_listAccessor;
+ d->m_listAccessor = 0;
d->m_modelVariant = model;
if (d->m_listModelInterface) {
// Assume caller has released all items.
@@ -642,8 +642,8 @@ void QFxVisualDataModel::setModel(const QVariant &model)
this, SLOT(_q_destroyingPackage(QmlPackage*)));
return;
}
- d->m_modelList = new QmlListAccessor;
- d->m_modelList->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
+ d->m_listAccessor = new QmlListAccessor;
+ d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
if (d->m_delegate && d->modelCount()) {
emit itemsInserted(0, d->modelCount());
emit countChanged();
diff --git a/src/declarative/util/qmltimer.cpp b/src/declarative/util/qmltimer.cpp
index b95d6ad..fdc57ff 100644
--- a/src/declarative/util/qmltimer.cpp
+++ b/src/declarative/util/qmltimer.cpp
@@ -100,6 +100,8 @@ QmlTimer::QmlTimer(QObject *parent)
\qmlproperty int Timer::interval
Sets the \a interval in milliseconds between triggering.
+
+ The default interval is 1000 milliseconds.
*/
void QmlTimer::setInterval(int interval)
{
@@ -123,6 +125,8 @@ int QmlTimer::interval() const
For a non-repeating timer, \a running will be set to false after the
timer has been triggered.
+ \a running defaults to false.
+
\sa repeat
*/
bool QmlTimer::isRunning() const
@@ -148,6 +152,8 @@ void QmlTimer::setRunning(bool running)
specified interval; otherwise, the timer will trigger once at the
specified interval and then stop (i.e. running will be set to false).
+ \a repeat defaults to false.
+
\sa running
*/
bool QmlTimer::isRepeating() const
@@ -169,7 +175,11 @@ void QmlTimer::setRepeating(bool repeating)
\qmlproperty bool Timer::triggeredOnStart
If \a triggeredOnStart is true, the timer will be triggered immediately
- when started, and subsequently at the specified interval.
+ when started, and subsequently at the specified interval. Note that for
+ a Timer with \e repeat set to false, this will result in the timer being
+ triggered twice; once on start, and again at the interval.
+
+ \a triggeredOnStart defaults to false.
\sa running
*/
@@ -198,7 +208,7 @@ void QmlTimer::setTriggeredOnStart(bool triggeredOnStart)
void QmlTimer::start()
{
Q_D(QmlTimer);
- d->pause.start();
+ setRunning(true);
}
/*!
@@ -211,7 +221,7 @@ void QmlTimer::start()
void QmlTimer::stop()
{
Q_D(QmlTimer);
- d->pause.stop();
+ setRunning(false);
}
void QmlTimer::update()
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index 4724278..f2ddbb7 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -7,13 +7,16 @@ SUBDIRS += datetimeformatter \
pathview \
qfxtext \
qfxtextedit \
- simplecanvasitem \
repeater \
qmllanguage \
qmlecmascript \
qmlmetaproperty \
qmllist \
qmllistaccessor \
+ qmltimer \
+ qfxloader \
+ qfxwebview \
+ states \
visual
# Tests which should run in Pulse
diff --git a/tests/auto/declarative/qmltimer/qmltimer.pro b/tests/auto/declarative/qmltimer/qmltimer.pro
new file mode 100644
index 0000000..e7edd96
--- /dev/null
+++ b/tests/auto/declarative/qmltimer/qmltimer.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+SOURCES += tst_qmltimer.cpp
+
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/qmltimer/tst_qmltimer.cpp b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp
new file mode 100644
index 0000000..15b558f
--- /dev/null
+++ b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp
@@ -0,0 +1,141 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qmltimer.h>
+
+class tst_qmltimer : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qmltimer();
+
+private slots:
+ void notRepeating();
+ void notRepeatingStart();
+ void repeat();
+ void triggeredOnStart();
+ void triggeredOnStartRepeat();
+};
+
+class TimerHelper : public QObject
+{
+ Q_OBJECT
+public:
+ TimerHelper() : QObject(), count(0)
+ {
+ }
+
+ int count;
+
+public slots:
+ void timeout() {
+ ++count;
+ }
+};
+
+#if defined(Q_OS_SYMBIAN) && defined(Q_CC_NOKIAX86)
+// Increase wait as emulator startup can cause unexpected delays
+#define TIMEOUT_TIMEOUT 2000
+#else
+#define TIMEOUT_TIMEOUT 200
+#endif
+
+tst_qmltimer::tst_qmltimer()
+{
+}
+
+void tst_qmltimer::notRepeating()
+{
+ QmlEngine engine;
+ QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; running: true }"), QUrl("file://"));
+ QmlTimer *timer = qobject_cast<QmlTimer*>(component.create());
+ QVERIFY(timer != 0);
+
+ TimerHelper helper;
+ connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout()));
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 1);
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 1);
+}
+
+void tst_qmltimer::notRepeatingStart()
+{
+ QmlEngine engine;
+ QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100 }"), QUrl("file://"));
+ QmlTimer *timer = qobject_cast<QmlTimer*>(component.create());
+ QVERIFY(timer != 0);
+
+ TimerHelper helper;
+ connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout()));
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 0);
+
+ timer->start();
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 1);
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 1);
+}
+
+void tst_qmltimer::repeat()
+{
+ QmlEngine engine;
+ QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; repeat: true; running: true }"), QUrl("file://"));
+ QmlTimer *timer = qobject_cast<QmlTimer*>(component.create());
+ QVERIFY(timer != 0);
+
+ TimerHelper helper;
+ connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout()));
+ QCOMPARE(helper.count, 0);
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QVERIFY(helper.count > 0);
+ int oldCount = helper.count;
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QVERIFY(helper.count > oldCount);
+}
+
+void tst_qmltimer::triggeredOnStart()
+{
+ QmlEngine engine;
+ QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; running: true; triggeredOnStart: true }"), QUrl("file://"));
+ QmlTimer *timer = qobject_cast<QmlTimer*>(component.create());
+ QVERIFY(timer != 0);
+
+ TimerHelper helper;
+ connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout()));
+ QTest::qWait(1);
+ QCOMPARE(helper.count, 1);
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 2);
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QCOMPARE(helper.count, 2);
+}
+
+void tst_qmltimer::triggeredOnStartRepeat()
+{
+ QmlEngine engine;
+ QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; running: true; triggeredOnStart: true; repeat: true }"), QUrl("file://"));
+ QmlTimer *timer = qobject_cast<QmlTimer*>(component.create());
+ QVERIFY(timer != 0);
+
+ TimerHelper helper;
+ connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout()));
+ QTest::qWait(1);
+ QCOMPARE(helper.count, 1);
+
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QVERIFY(helper.count > 1);
+ int oldCount = helper.count;
+ QTest::qWait(TIMEOUT_TIMEOUT);
+ QVERIFY(helper.count > oldCount);
+}
+
+QTEST_MAIN(tst_qmltimer)
+
+#include "tst_qmltimer.moc"