summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorNo'am Rosenthal <noam.rosenthal@nokia.com>2011-08-09 10:47:23 -0700
committerNo'am Rosenthal <noam.rosenthal@nokia.com>2011-08-09 10:47:23 -0700
commit78abcf07d8fa6a66478354533719b418995999b3 (patch)
tree6db7250d75cd3ec2cb7098f528fe7937a65b737e /examples
parenta72bbbd54e3522e2a925c2fdf7246e146beeede6 (diff)
downloadqtwebchannel-78abcf07d8fa6a66478354533719b418995999b3.tar.gz
Added QObject example
Diffstat (limited to 'examples')
-rw-r--r--examples/qtobject/main.cpp18
-rw-r--r--examples/qtobject/qml/qtobject/index.html89
-rw-r--r--examples/qtobject/qml/qtobject/main.qml105
-rw-r--r--examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.cpp156
-rw-r--r--examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.h42
-rw-r--r--examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.pri133
-rw-r--r--examples/qtobject/qtmetaobjectpublisher.cpp32
-rw-r--r--examples/qtobject/qtmetaobjectpublisher.h34
-rw-r--r--examples/qtobject/qtobject.desktop11
-rw-r--r--examples/qtobject/qtobject.pngbin0 -> 3400 bytes
-rw-r--r--examples/qtobject/qtobject.pro37
-rw-r--r--examples/qtobject/qtobject.svg93
-rw-r--r--examples/qtobject/testobject.cpp20
-rw-r--r--examples/qtobject/testobject.h32
14 files changed, 802 insertions, 0 deletions
diff --git a/examples/qtobject/main.cpp b/examples/qtobject/main.cpp
new file mode 100644
index 0000000..3887620
--- /dev/null
+++ b/examples/qtobject/main.cpp
@@ -0,0 +1,18 @@
+#include <QtGui/QApplication>
+#include "qmlapplicationviewer.h"
+#include <qdeclarative.h>
+#include "qtmetaobjectpublisher.h"
+#include "testobject.h"
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ qmlRegisterType<QtMetaObjectPublisher>("Qt.labs", 1, 0, "QtMetaObjectPublisher");
+ qmlRegisterType<TestObject>("Qt.labs", 1, 0, "TestObject");
+
+ QmlApplicationViewer viewer;
+ viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
+ viewer.setMainQmlFile(QLatin1String("qml/qtobject/main.qml"));
+ viewer.showExpanded();
+
+ return app.exec();
+}
diff --git a/examples/qtobject/qml/qtobject/index.html b/examples/qtobject/qml/qtobject/index.html
new file mode 100644
index 0000000..a86d3c2
--- /dev/null
+++ b/examples/qtobject/qml/qtobject/index.html
@@ -0,0 +1,89 @@
+<html>
+ <head>
+ <script>
+ document.write('<script src="' + (/[?&]webChannelBaseUrl=([A-Za-z0-9\-:/]+)/.exec(location.search)[1]) + '/webchannel.js/createWebChannel"><' + '/script>');
+ function output(x)
+ {
+ document.querySelector("#out").innerHTML += x + "<br/>";
+ }
+ </script>
+ <script>
+ function createObjectProxy(webChannel, objectName, data)
+ {
+ var object = {_qtSignals: []};
+ var methodsAndSignals = [];
+ for (var i = 0; i < data.methods.length; ++i)
+ methodsAndSignals.push(data.methods[i]);
+ for (var i = 0; i < data.signals.length; ++i)
+ methodsAndSignals.push(data.signals[i]);
+ methodsAndSignals.forEach(function(method) {
+ object[method] = function(args, callback) {
+ webChannel.exec(JSON.stringify({type: "Qt.invokeMethod", object: objectName, method: method, args: args}), function(response) {
+ (callback)(JSON.parse(response));
+ });
+ };
+ });
+ data.signals.forEach(function(signal) {
+ object[signal].connect = function() {
+ webChannel.exec(JSON.stringify({type: "Qt.connectToSignal", signal: signal}));
+ var func, target;
+ for (var i = 0; i < arguments; ++i) {
+ if (typeof arguments[i] == "function" || typeof arguments[i] == "string")
+ func = arguments[i];
+ else if (typeof arguments[i] == "object")
+ target = arguments[i];
+ }
+ if (typeof func == "string") {
+ if (!target)
+ return;
+ func = target[func];
+ }
+ if (typeof func != "function")
+ return;
+ object["_qtSignals"].push({name: signal, target: target, func: func});
+ };
+ });
+
+ data.properties.forEach(function(prop) {
+ object.__defineSetter__(prop, function(value) {
+ webChannel.exec(JSON.stringify({type: "Qt.setProperty", object: objectName, property: prop, value: value }));
+ });
+ object.__defineGetter__(prop, function() {
+ return (function(callback) {
+ webChannel.exec(JSON.stringify({type: "Qt.getProperty", object: objectName, property: prop}), function(response) {
+ callback(JSON.parse(response));
+ });
+ });
+ });
+ });
+ return object;
+ }
+ window.onload = function() {
+ createWebChannel(function(webChannel) {
+ webChannel.subscribe(
+ "Qt.signal",
+ function(payload) {
+ alert(1);
+ output(payload);
+ }
+ );
+ webChannel.subscribe(
+ "Qt.addObject",
+ function(payload) {
+ var addObjectData = JSON.parse(payload);
+ alert(addObjectData.name);
+ window[addObjectData.name] = createObjectProxy(webChannel, addObjectData.name, addObjectData.data);
+ }
+ );
+ webChannel.exec(JSON.stringify({type:"Qt.getObjects"}));
+ });
+ };
+ </script>
+ </head>
+ <body>
+ <a href="javascript:testObject.debugMe('Debugging!')">invoke method</a>
+ <a href="javascript:testObject.prop1(function(value) { output(value); })">Get property</a>
+ <a href="javascript:testObject.prop1 = 'Different property'; testObject.prop1(function(value) { output(value); })">Set property</a>
+ <div id="out"></div>
+ </body>
+</html>
diff --git a/examples/qtobject/qml/qtobject/main.qml b/examples/qtobject/qml/qtobject/main.qml
new file mode 100644
index 0000000..603df6a
--- /dev/null
+++ b/examples/qtobject/qml/qtobject/main.qml
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QWebChannel module on Qt labs.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.labs 1.0
+import Qt.labs.WebChannel 1.0
+import QtWebKit 1.0
+
+Rectangle {
+ QtMetaObjectPublisher {
+ id: publisher
+ }
+
+ TestObject {
+ id: testObject
+ }
+
+ WebChannel {
+ id: webChannel
+ onExecute: {
+ var payload = JSON.parse(requestData);
+ var object = publisher.namedObject(payload.object);
+ var ret;
+ console.log(requestData);
+ if (payload.type == "Qt.invokeMethod") {
+ ret = (object[payload.method])(payload.args);
+ } else if (payload.type == "Qt.connectToSignal") {
+ object[payload.signal].connect(
+ function(a,b,c,d,e,f,g,h,i,j) {
+ broadcast("Qt.signal", JSON.stringify({object: payload.object, signal: payload.signal, arguments: [a,b,c,d,e,f,g,h,i,j]}));
+ });
+ } else if (payload.type == "Qt.getProperty") {
+ ret = object[payload.property];
+ } else if (payload.type == "Qt.setProperty") {
+ object[payload.property] = payload.value;
+ } else if (payload.type == "Qt.getObjects") {
+ var objectNames = publisher.objectNames;
+ for (var i = 0; i < objectNames.length; ++i) {
+ var name = objectNames[i];
+ var object = publisher.namedObject(name);
+ addObject(name, object);
+ }
+ }
+
+ response.send(JSON.stringify(ret));
+ }
+
+ function addObject(name, object)
+ {
+ publisher.addObject(name, object);
+ var metaData = { name: name, data: publisher.classInfoForObject(object) };
+ broadcast("Qt.addObject", JSON.stringify(metaData));
+ }
+
+ onBaseUrlChanged: addObject("testObject", testObject)
+ }
+
+ width: 480
+ height: 800
+
+ WebView {
+ anchors.fill: parent
+ url: "index.html?webChannelBaseUrl=" + webChannel.baseUrl
+ onAlert: console.log(message)
+ settings.developerExtrasEnabled: true
+ }
+}
diff --git a/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.cpp b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.cpp
new file mode 100644
index 0000000..b3e862c
--- /dev/null
+++ b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.cpp
@@ -0,0 +1,156 @@
+// checksum 0x7895 version 0x4000b
+/*
+ This file was generated by the Qt Quick Application wizard of Qt Creator.
+ QmlApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qmlapplicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtDeclarative/QDeclarativeComponent>
+#include <QtDeclarative/QDeclarativeEngine>
+#include <QtDeclarative/QDeclarativeContext>
+
+#if defined(QMLJSDEBUGGER)
+#include <qt_private/qdeclarativedebughelper_p.h>
+#endif
+
+#if defined(QMLJSDEBUGGER) && !defined(NO_JSDEBUGGER)
+#include <jsdebuggeragent.h>
+#endif
+#if defined(QMLJSDEBUGGER) && !defined(NO_QMLOBSERVER)
+#include <qdeclarativeviewobserver.h>
+#endif
+
+#if defined(QMLJSDEBUGGER)
+
+// Enable debugging before any QDeclarativeEngine is created
+struct QmlJsDebuggingEnabler
+{
+ QmlJsDebuggingEnabler()
+ {
+ QDeclarativeDebugHelper::enableDebugging();
+ }
+};
+
+// Execute code in constructor before first QDeclarativeEngine is instantiated
+static QmlJsDebuggingEnabler enableDebuggingHelper;
+
+#endif // QMLJSDEBUGGER
+
+class QmlApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QmlApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QmlApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#ifdef Q_OS_UNIX
+#ifdef Q_OS_MAC
+ if (!QDir::isAbsolutePath(path))
+ return QCoreApplication::applicationDirPath()
+ + QLatin1String("/../Resources/") + path;
+#else
+ const QString pathInInstallDir = QCoreApplication::applicationDirPath()
+ + QLatin1String("/../") + path;
+ if (pathInInstallDir.contains(QLatin1String("opt"))
+ && pathInInstallDir.contains(QLatin1String("bin"))
+ && QFileInfo(pathInInstallDir).exists()) {
+ return pathInInstallDir;
+ }
+#endif
+#endif
+ return path;
+}
+
+QmlApplicationViewer::QmlApplicationViewer(QWidget *parent) :
+ QDeclarativeView(parent),
+ m_d(new QmlApplicationViewerPrivate)
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QDeclarativeView::SizeRootObjectToView);
+#if defined(QMLJSDEBUGGER) && !defined(NO_JSDEBUGGER)
+ new QmlJSDebugger::JSDebuggerAgent(engine());
+#endif
+#if defined(QMLJSDEBUGGER) && !defined(NO_QMLOBSERVER)
+ new QmlJSDebugger::QDeclarativeViewObserver(this, this);
+#endif
+}
+
+QmlApplicationViewer::~QmlApplicationViewer()
+{
+ delete m_d;
+}
+
+void QmlApplicationViewer::setMainQmlFile(const QString &file)
+{
+ m_d->mainQmlFile = QmlApplicationViewerPrivate::adjustPath(file);
+ setSource(QUrl::fromLocalFile(m_d->mainQmlFile));
+}
+
+void QmlApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QmlApplicationViewerPrivate::adjustPath(path));
+}
+
+void QmlApplicationViewer::setOrientation(ScreenOrientation orientation)
+{
+#if defined(Q_OS_SYMBIAN)
+ // If the version of Qt on the device is < 4.7.2, that attribute won't work
+ if (orientation != ScreenOrientationAuto) {
+ const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
+ if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
+ qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
+ return;
+ }
+ }
+#endif // Q_OS_SYMBIAN
+
+ Qt::WidgetAttribute attribute;
+ switch (orientation) {
+#if QT_VERSION < 0x040702
+ // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
+ case ScreenOrientationLockPortrait:
+ attribute = static_cast<Qt::WidgetAttribute>(128);
+ break;
+ case ScreenOrientationLockLandscape:
+ attribute = static_cast<Qt::WidgetAttribute>(129);
+ break;
+ default:
+ case ScreenOrientationAuto:
+ attribute = static_cast<Qt::WidgetAttribute>(130);
+ break;
+#else // QT_VERSION < 0x040702
+ case ScreenOrientationLockPortrait:
+ attribute = Qt::WA_LockPortraitOrientation;
+ break;
+ case ScreenOrientationLockLandscape:
+ attribute = Qt::WA_LockLandscapeOrientation;
+ break;
+ default:
+ case ScreenOrientationAuto:
+ attribute = Qt::WA_AutoOrientation;
+ break;
+#endif // QT_VERSION < 0x040702
+ };
+ setAttribute(attribute, true);
+}
+
+void QmlApplicationViewer::showExpanded()
+{
+#ifdef Q_OS_SYMBIAN
+ showFullScreen();
+#elif defined(Q_WS_MAEMO_5)
+ showMaximized();
+#else
+ show();
+#endif
+}
diff --git a/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.h b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.h
new file mode 100644
index 0000000..19875a3
--- /dev/null
+++ b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.h
@@ -0,0 +1,42 @@
+// checksum 0x382f version 0x4000b
+/*
+ This file was generated by the Qt Quick Application wizard of Qt Creator.
+ QmlApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QMLAPPLICATIONVIEWER_H
+#define QMLAPPLICATIONVIEWER_H
+
+#include <QtDeclarative/QDeclarativeView>
+
+class QmlApplicationViewer : public QDeclarativeView
+{
+ Q_OBJECT
+
+public:
+ enum ScreenOrientation {
+ ScreenOrientationLockPortrait,
+ ScreenOrientationLockLandscape,
+ ScreenOrientationAuto
+ };
+
+ explicit QmlApplicationViewer(QWidget *parent = 0);
+ virtual ~QmlApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ // Note that this will only have an effect on Symbian and Fremantle.
+ void setOrientation(ScreenOrientation orientation);
+
+ void showExpanded();
+
+private:
+ class QmlApplicationViewerPrivate *m_d;
+};
+
+#endif // QMLAPPLICATIONVIEWER_H
diff --git a/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.pri b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.pri
new file mode 100644
index 0000000..b07f873
--- /dev/null
+++ b/examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.pri
@@ -0,0 +1,133 @@
+# checksum 0xcaf1 version 0x4000b
+# This file was generated by the Qt Quick Application wizard of Qt Creator.
+# The code below adds the QmlApplicationViewer to the project and handles the
+# activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += declarative
+
+SOURCES += $$PWD/qmlapplicationviewer.cpp
+HEADERS += $$PWD/qmlapplicationviewer.h
+INCLUDEPATH += $$PWD
+
+# Include JS debugger library if QMLJSDEBUGGER_PATH is set
+!isEmpty(QMLJSDEBUGGER_PATH) {
+ include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri)
+} else {
+ DEFINES -= QMLJSDEBUGGER
+}
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Symbian and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemsources = $${item}.sources
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+symbian {
+ isEmpty(ICON):exists($${TARGET}.svg):ICON = $${TARGET}.svg
+ isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.path = /usr/share/applications/hildon
+ } else {
+ desktopfile.path = /usr/share/applications
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ installPrefix = /opt/$${TARGET}
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+ icon.files = $${TARGET}.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ desktopfile.files = $${TARGET}.desktop
+ target.path = $${installPrefix}/bin
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ export(target.path)
+ INSTALLS += desktopfile icon target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (TARGET.EPOCHEAPSIZE)
+export (TARGET.CAPABILITY)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/qtobject/qtmetaobjectpublisher.cpp b/examples/qtobject/qtmetaobjectpublisher.cpp
new file mode 100644
index 0000000..f515576
--- /dev/null
+++ b/examples/qtobject/qtmetaobjectpublisher.cpp
@@ -0,0 +1,32 @@
+#include "qtmetaobjectpublisher.h"
+#include <QVariantMap>
+#include <QStringList>
+#include <QMetaObject>
+#include <QMetaProperty>
+
+QtMetaObjectPublisher::QtMetaObjectPublisher(QObject *parent) :
+ QObject(parent)
+{
+}
+
+QVariantMap QtMetaObjectPublisher::classInfoForObject(QObject *object)
+{
+ QVariantMap data;
+ QStringList qtSignals, qtMethods, qtProperties;
+ const QMetaObject* metaObject = object->metaObject();
+ for (int i = 0; i < metaObject->propertyCount(); ++i)
+ qtProperties.append(metaObject->property(i).name());
+ for (int i = 0; i < metaObject->methodCount(); ++i) {
+ QMetaMethod method = metaObject->method(i);
+ QString signature = method.signature();
+ QString name = signature.left(signature.indexOf("("));
+ if (method.access() == QMetaMethod::Public)
+ qtMethods << signature << name;
+ if (method.methodType() == QMetaMethod::Signal)
+ qtSignals << signature << name;
+ }
+ data["signals"] = qtSignals;
+ data["methods"] = qtMethods;
+ data["properties"] = qtProperties;
+ return data;
+}
diff --git a/examples/qtobject/qtmetaobjectpublisher.h b/examples/qtobject/qtmetaobjectpublisher.h
new file mode 100644
index 0000000..3262525
--- /dev/null
+++ b/examples/qtobject/qtmetaobjectpublisher.h
@@ -0,0 +1,34 @@
+#ifndef QTMETAOBJECTPUBLISHER_H
+#define QTMETAOBJECTPUBLISHER_H
+
+#include <QObject>
+#include <QVariantMap>
+#include <QPointer>
+#include <QStringList>
+
+class QtMetaObjectPublisher : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QStringList objectNames READ objectNames)
+public:
+ explicit QtMetaObjectPublisher(QObject *parent = 0);
+ Q_INVOKABLE QVariantMap classInfoForObject(QObject*);
+ QStringList objectNames() { return objects.keys(); }
+ Q_INVOKABLE QObject* namedObject(const QString& name) {
+ if (!objects.contains(name))
+ return 0;
+ return objects[name];
+ }
+
+public slots:
+ void addObject(const QString& name, QObject* object)
+ {
+ objects[name] = object;
+ }
+
+private:
+ QMap<QString, QPointer<QObject> > objects;
+
+};
+
+#endif // QTMETAOBJECTPUBLISHER_H
diff --git a/examples/qtobject/qtobject.desktop b/examples/qtobject/qtobject.desktop
new file mode 100644
index 0000000..1bf3f8a
--- /dev/null
+++ b/examples/qtobject/qtobject.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qtobject
+Exec=/opt/qtobject/bin/qtobject
+Icon=qtobject
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/qtobject/qtobject.png b/examples/qtobject/qtobject.png
new file mode 100644
index 0000000..707d5c4
--- /dev/null
+++ b/examples/qtobject/qtobject.png
Binary files differ
diff --git a/examples/qtobject/qtobject.pro b/examples/qtobject/qtobject.pro
new file mode 100644
index 0000000..6607ca0
--- /dev/null
+++ b/examples/qtobject/qtobject.pro
@@ -0,0 +1,37 @@
+# Add more folders to ship with the application, here
+folder_01.source = qml/qtobject
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+symbian:TARGET.UID3 = 0xED2D43D7
+
+# Smart Installer package's UID
+# This UID is from the protected range and therefore the package will
+# fail to install if self-signed. By default qmake uses the unprotected
+# range value if unprotected UID is defined for the application and
+# 0x2002CCCF value if protected UID is given to the application
+#symbian:DEPLOYMENT.installer_header = 0x2002CCCF
+
+# Allow network access on Symbian
+symbian:TARGET.CAPABILITY += NetworkServices
+
+# If your application uses the Qt Mobility libraries, uncomment the following
+# lines and add the respective components to the MOBILITY variable.
+# CONFIG += mobility
+# MOBILITY +=
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp \
+ qtmetaobjectpublisher.cpp \
+ testobject.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qmlapplicationviewer/qmlapplicationviewer.pri)
+qtcAddDeployment()
+
+HEADERS += \
+ qtmetaobjectpublisher.h \
+ testobject.h
diff --git a/examples/qtobject/qtobject.svg b/examples/qtobject/qtobject.svg
new file mode 100644
index 0000000..566acfa
--- /dev/null
+++ b/examples/qtobject/qtobject.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="44px"
+ version="1.1"
+ viewBox="0 0 44 44"
+ width="44px"
+ x="0px"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="qt.svg">
+ <metadata
+ id="metadata18">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs16">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 22 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="44 : 22 : 1"
+ inkscape:persp3d-origin="22 : 14.666667 : 1"
+ id="perspective2836" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1020"
+ id="namedview14"
+ showgrid="false"
+ inkscape:zoom="21.454545"
+ inkscape:cx="49.412871"
+ inkscape:cy="21.894358"
+ inkscape:window-x="-4"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3" />
+ <g
+ transform="matrix(0.18308778,0,0,0.18308778,6.6100946,3.2385199)"
+ id="g3">
+ <path
+ d="M 43.09,0.3586 C 40.94,0.0036 38.84,-0.0824 36.81,0.0776 31.968136,0.39505671 27.122677,0.73638425 22.28,1.0696 9.62,2.0816 0,12.4996 0,26.8896 l 0,169.7 14.19,13.2 28.87,-209.42 0.03,-0.011 z"
+ style="fill:#006225"
+ id="path5"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ d="m 174.4,160 c 0,12.5 -7.75,24.07 -17.57,25.77 L 14.23,209.73 V 25.93 C 14.23,9.21 27.57,-2.27 43.12,0.3 l 131.3,21.52 v 138.2 z"
+ style="fill:#80c342"
+ id="path7" />
+ <path
+ d="m 154.9,80.96 -12.96,-0.598 0,0.278 6.945,0.32 6.016,0 z"
+ style="fill:#006225"
+ id="path11" />
+ <path
+ d="m 144.6,135.6 c 0.66,0.328 1.43,0.476 2.351,0.476 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 h -6.015 c -1.821,0.832 -3.532,1.457 -5.176,1.848 z"
+ style="fill:#006225"
+ id="path13" />
+ <path
+ id="path17"
+ style="fill:#ffffff"
+ d="m 91.15,132.4 c 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -4.34,0 -7.68,2.535 -10.01,7.625 -2.52,5.543 -3.793,17.04 -3.793,34.44 0,16.82 1.238,28.75 3.734,35.75 2.356,6.672 5.879,9.976 10.5,9.976 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 m 17.98,3.75 c -4.117,9.707 -10.39,16.06 -18.99,19 0.867,4.449 2.176,7.441 3.922,9.019 1.351,1.211 3.433,1.821 6.222,1.821 0.805,0 1.668,-0.055 2.59,-0.157 v 13.12 l -5.961,0.782 c -1.758,0.23 -3.426,0.343 -5.004,0.343 -5.218,0 -9.445,-1.265 -12.62,-3.824 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 1.629,0 3.309,0.102 5.043,0.305 11.95,1.375 20.62,7.016 26.26,16.79 5.535,9.562 8.254,23.27 8.254,41.26 0,16.48 -2,29.45 -6.043,39.02 z M 130.4,45.91 l 11.52,1.238 0,20.21 12.96,0.914 0,12.68 -12.96,-0.598 0,46.33 c 0,4.032 0.445,6.625 1.34,7.789 0.8,1.067 2.046,1.594 3.71,1.594 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 v 11.65 c -5.136,2.258 -10.18,3.598 -15.12,4.02 -0.718,0.055 -1.41,0.086 -2.078,0.086 -4.48,0 -7.906,-1.301 -10.25,-3.934 -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.535 L 118.046,79.25 V 65.66 l 7.586,0.547 4.773,-20.3 z" />
+ <path
+ d="m 100.3,166 c 0.809,0 1.672,-0.055 2.59,-0.157 H 98.054 C 98.73,165.949 99.507,166 100.3,166 z"
+ style="fill:#006225"
+ id="path19" />
+ <path
+ id="path21"
+ style="fill:#006225"
+ d="m 84.85,63.98 c 2.336,5.997 3.484,16.92 3.484,32.81 0,17.7 -1.16,29.57 -3.512,35.62 -1.894,4.879 -4.527,7.902 -7.863,9.07 0.965,0.368 1.992,0.551 3.078,0.551 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -1.09,0 -2.117,0.16 -3.082,0.481 h -0.004 c 3.601,1.121 6.379,4.215 8.336,9.261 z m -2.344,114.3 c -0.113,-0.05 -0.227,-0.105 -0.336,-0.16 -0.012,-0.004 -0.023,-0.012 -0.035,-0.015 -0.102,-0.051 -0.207,-0.106 -0.309,-0.157 -0.019,-0.011 -0.039,-0.019 -0.058,-0.031 -0.09,-0.051 -0.184,-0.098 -0.278,-0.148 -0.027,-0.016 -0.054,-0.036 -0.086,-0.051 -0.082,-0.043 -0.164,-0.09 -0.242,-0.137 -0.039,-0.023 -0.078,-0.047 -0.113,-0.07 -0.07,-0.039 -0.145,-0.082 -0.215,-0.125 -0.047,-0.031 -0.094,-0.059 -0.14,-0.09 -0.059,-0.039 -0.118,-0.074 -0.176,-0.113 -0.059,-0.039 -0.114,-0.075 -0.168,-0.114 -0.051,-0.031 -0.102,-0.066 -0.149,-0.097 -0.066,-0.047 -0.132,-0.094 -0.195,-0.137 -0.039,-0.027 -0.078,-0.055 -0.113,-0.082 -0.078,-0.055 -0.153,-0.113 -0.231,-0.172 -0.023,-0.016 -0.05,-0.035 -0.078,-0.055 -0.098,-0.078 -0.199,-0.156 -0.297,-0.234 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 h -6.351 c -10.15,0.008 -18.22,3.977 -24,12.04 -6.855,9.563 -10.34,24.64 -10.34,45.07 0,18.95 2.547,33.44 7.551,43.34 4.934,9.75 12.05,15.56 21.19,17.5 1.989,9.641 5.09,16.16 9.297,19.54 3.176,2.559 7.403,3.824 12.62,3.824 0.098,0 0.199,0 0.297,-0.004 h 5.539 c -3.406,-0.05 -6.383,-0.66 -8.906,-1.828 L 82.498,178.28 z M 128.4,145.6 c -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.57 l -6.226,-0.285 v -13.59 h -6.016 v 3.035 c 0.871,3.273 1.555,6.82 2.063,10.64 l 4.164,0.192 v 51.36 c 0,6.723 1.367,11.62 4.09,14.67 2.343,2.633 5.765,3.934 10.25,3.934 h 6.015 c -4.48,0 -7.906,-1.301 -10.25,-3.934 z m 2.043,-99.66 -6.016,0 -4.668,19.88 5.911,0.422 4.773,-20.3 z" />
+ </g>
+</svg>
diff --git a/examples/qtobject/testobject.cpp b/examples/qtobject/testobject.cpp
new file mode 100644
index 0000000..5d2f3ce
--- /dev/null
+++ b/examples/qtobject/testobject.cpp
@@ -0,0 +1,20 @@
+#include "testobject.h"
+
+TestObject::TestObject(QObject *parent) :
+ QObject(parent)
+ , p1("Hello World")
+{
+ connect(&timer, SIGNAL(timeout()), this, SIGNAL(timeout()));
+}
+
+void TestObject::debugMe(const QString& data)
+{
+ qWarning() << data;
+}
+
+void TestObject::setProp1(const QString& s)
+{
+ p1 = s;
+ qWarning() << __func__ << p1;
+}
+
diff --git a/examples/qtobject/testobject.h b/examples/qtobject/testobject.h
new file mode 100644
index 0000000..de60f36
--- /dev/null
+++ b/examples/qtobject/testobject.h
@@ -0,0 +1,32 @@
+#ifndef TESTOBJECT_H
+#define TESTOBJECT_H
+
+#include <QObject>
+#include <QtDebug>
+#include <QTimer>
+class TestObject : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString prop1 READ prop1 WRITE setProp1)
+public:
+ explicit TestObject(QObject *parent = 0);
+ QString prop1() const { return p1; }
+ void setProp1(const QString& s);
+
+signals:
+ void timeout();
+
+public slots:
+ void startTimer(int millis)
+ {
+ timer.start(millis);
+ }
+
+ void debugMe(const QString& data);
+
+private:
+ QString p1;
+ QTimer timer;
+};
+
+#endif // TESTOBJECT_H