forked from benlau/quickflux
/
qfappdispatcher.cpp
68 lines (44 loc) · 1.97 KB
/
qfappdispatcher.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <QtCore>
#include <QQmlComponent>
#include "qfappdispatcher.h"
QFAppDispatcher::QFAppDispatcher(QObject *parent) : QFDispatcher(parent)
{
}
/*! \fn QFAppDispatcher *QFAppDispatcher::instance(QQmlEngine *engine)
Obtain the singleton instance of AppDispatcher for specific \a engine
*/
QFAppDispatcher *QFAppDispatcher::instance(QQmlEngine *engine)
{
QFAppDispatcher *dispatcher = qobject_cast<QFAppDispatcher*>(singletonObject(engine,"QuickFlux",1,0,"AppDispatcher"));
return dispatcher;
}
/*! \fn QObject *QFAppDispatcher::singletonObject(QQmlEngine *engine, QString package, int versionMajor, int versionMinor, QString typeName)
\a engine QQmlEngine instance
\a package The package name of the singleton object
\a versionMajor The major version no. of the singleton object
\a versionMinor The minor version no. of the singleton object
\a typeName The name of the singleton object
Obtain a singleton object from a package for specific QQmlEngine instance.
It is useful when you need to get a singleton Actions object from C++.
*/
QObject *QFAppDispatcher::singletonObject(QQmlEngine *engine, QString package, int versionMajor, int versionMinor, QString typeName)
{
QString pattern = "import QtQuick 2.0\nimport %1 %2.%3;QtObject { property var object : %4 }";
QString qml = pattern.arg(package).arg(versionMajor).arg(versionMinor).arg(typeName);
QObject* holder = 0;
QQmlComponent comp (engine);
comp.setData(qml.toUtf8(),QUrl());
holder = comp.create();
if (!holder) {
qWarning() << QString("QuickFlux: Failed to gain singleton object: %1").arg(typeName);
qWarning() << QString("Error: ") << comp.errorString();
return 0;
}
QObject*object = holder->property("object").value<QObject*>();
holder->deleteLater();
if (!object) {
qWarning() << QString("QuickFlux: Failed to gain singleton object: %1").arg(typeName);
qWarning() << QString("Error: Unknown");
}
return object;
}