diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2011-08-09 10:47:23 -0700 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2011-08-09 10:47:23 -0700 |
commit | 78abcf07d8fa6a66478354533719b418995999b3 (patch) | |
tree | 6db7250d75cd3ec2cb7098f528fe7937a65b737e /examples | |
parent | a72bbbd54e3522e2a925c2fdf7246e146beeede6 (diff) | |
download | qtwebchannel-78abcf07d8fa6a66478354533719b418995999b3.tar.gz |
Added QObject example
Diffstat (limited to 'examples')
-rw-r--r-- | examples/qtobject/main.cpp | 18 | ||||
-rw-r--r-- | examples/qtobject/qml/qtobject/index.html | 89 | ||||
-rw-r--r-- | examples/qtobject/qml/qtobject/main.qml | 105 | ||||
-rw-r--r-- | examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.cpp | 156 | ||||
-rw-r--r-- | examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.h | 42 | ||||
-rw-r--r-- | examples/qtobject/qmlapplicationviewer/qmlapplicationviewer.pri | 133 | ||||
-rw-r--r-- | examples/qtobject/qtmetaobjectpublisher.cpp | 32 | ||||
-rw-r--r-- | examples/qtobject/qtmetaobjectpublisher.h | 34 | ||||
-rw-r--r-- | examples/qtobject/qtobject.desktop | 11 | ||||
-rw-r--r-- | examples/qtobject/qtobject.png | bin | 0 -> 3400 bytes | |||
-rw-r--r-- | examples/qtobject/qtobject.pro | 37 | ||||
-rw-r--r-- | examples/qtobject/qtobject.svg | 93 | ||||
-rw-r--r-- | examples/qtobject/testobject.cpp | 20 | ||||
-rw-r--r-- | examples/qtobject/testobject.h | 32 |
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 Binary files differnew file mode 100644 index 0000000..707d5c4 --- /dev/null +++ b/examples/qtobject/qtobject.png 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 |