diff options
author | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2017-05-19 13:37:05 +0200 |
---|---|---|
committer | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2017-06-15 12:43:41 +0000 |
commit | 46f79d565cedb989c5cdc1e3af6ed1bf505ec6fd (patch) | |
tree | b3259a3d9078b0381af6892e3676dd27743f2ea9 /examples | |
parent | ea3dc64d3fd2948fce3c21179dc71684647bee0e (diff) |
Add QML example
Instead of providing an API for QML it was decided to rather showcase
how to do this manually. Potentially this decision might be revisited at
a later point.
Change-Id: If274fa681b05733d755602c3d9837c809e41fc3d
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/mqtt/mqtt.pro | 3 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/main.cpp | 71 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/main.qml | 191 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/qml.qrc | 5 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/qmlmqttclient.cpp | 81 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/qmlmqttclient.h | 94 | ||||
-rw-r--r-- | examples/mqtt/quicksubscription/quicksubscription.pro | 32 |
7 files changed, 476 insertions, 1 deletions
diff --git a/examples/mqtt/mqtt.pro b/examples/mqtt/mqtt.pro index 081e393..5c4c4d2 100644 --- a/examples/mqtt/mqtt.pro +++ b/examples/mqtt/mqtt.pro @@ -1,4 +1,5 @@ TEMPLATE = subdirs SUBDIRS += \ simpleclient \ - subscriptions + subscriptions \ + quicksubscription diff --git a/examples/mqtt/quicksubscription/main.cpp b/examples/mqtt/quicksubscription/main.cpp new file mode 100644 index 0000000..72133a3 --- /dev/null +++ b/examples/mqtt/quicksubscription/main.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qmlmqttclient.h" + +#include <QGuiApplication> +#include <QQmlApplicationEngine> +#include <QLoggingCategory> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + + qmlRegisterType<QmlMqttClient>("MqttClient", 1, 0, "MqttClient"); + qmlRegisterUncreatableType<QmlMqttSubscription>("MqttClient", 1, 0, "MqttSubscription", QLatin1String("Subscriptions are read-only")); + + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff --git a/examples/mqtt/quicksubscription/main.qml b/examples/mqtt/quicksubscription/main.qml new file mode 100644 index 0000000..d42eddd --- /dev/null +++ b/examples/mqtt/quicksubscription/main.qml @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.1 +import QtQuick.Layouts 1.1 +import MqttClient 1.0 + +Window { + visible: true + width: 640 + height: 480 + title: qsTr("Hello World") + id: root + + property var tempSubscription: 0 + + MqttClient { + id: client + hostname: hostnameField.text + port: portField.text + } + + ListModel { + id: messageModel + } + + function addMessage(payload) + { + messageModel.insert(0, {"payload" : payload}) + + if (messageModel.count >= 100) + messageModel.remove(99) + } + + GridLayout { + anchors.fill: parent + columns: 2 + + Label { + text: "Hostname:" + enabled: client.state === MqttClient.Disconnected + } + + TextField { + id: hostnameField + Layout.fillWidth: true +// text: "broker.hivemq.com" + text: "test.mosquitto.org" + placeholderText: "<Enter host running MQTT broker>" + enabled: client.state === MqttClient.Disconnected + } + + Label { + text: "Port:" + enabled: client.state === MqttClient.Disconnected + } + + TextField { + id: portField + Layout.fillWidth: true + text: "1883" + placeholderText: "<Port>" + inputMethodHints: Qt.ImhDigitsOnly + enabled: client.state === MqttClient.Disconnected + } + + Button { + id: connectButton + Layout.columnSpan: 2 + text: client.state === MqttClient.Connected ? "Disconnect" : "Connect" + onClicked: { + if (client.state === MqttClient.Connected) + client.disconnectFromHost() + else + client.connectToHost() + } + } + + RowLayout { + enabled: client.state === MqttClient.Connected + Layout.columnSpan: 2 + Layout.fillWidth: true + + Label { + text: "Topic:" + } + + TextField { + id: subField + placeholderText: "<Subscription topic>" + } + + Button { + id: subButton + text: "Subscribe" + onClicked: { + if (subField.text.length === 0) + return + tempSubscription = client.subscribe(subField.text) + tempSubscription.messageReceived.connect(addMessage) + } + } + } + + ListView { + id: messageView + model: messageModel + height: 300 + width: 200 + Layout.fillHeight: true + delegate: Rectangle { + width: 150 + height: 30 + color: index % 2 ? "#DDDDDD" : "#888888" + radius: 5 + Text { + text: payload + anchors.centerIn: parent + } + } + } + + Label { + function stateToString(value) { + if (value === 0) + return "Disconnected" + else if (value === 1) + return "Connecting" + else if (value === 2) + return "Connected" + else + return "Unknown" + } + + Layout.columnSpan: 2 + Layout.fillWidth: true + color: "#333333" + text: "Status:" + stateToString(client.state) + "(" + client.state + ")" + enabled: client.state === MqttClient.Connected + } + } +} diff --git a/examples/mqtt/quicksubscription/qml.qrc b/examples/mqtt/quicksubscription/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/examples/mqtt/quicksubscription/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/mqtt/quicksubscription/qmlmqttclient.cpp b/examples/mqtt/quicksubscription/qmlmqttclient.cpp new file mode 100644 index 0000000..e97cc99 --- /dev/null +++ b/examples/mqtt/quicksubscription/qmlmqttclient.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qmlmqttclient.h" +#include <QDebug> + +QmlMqttClient::QmlMqttClient(QObject *parent) + : QMqttClient(parent) +{ +} + +QmlMqttSubscription* QmlMqttClient::subscribe(const QString &topic) +{ + QSharedPointer<QMqttSubscription> sub = QMqttClient::subscribe(topic, 0); + auto result = new QmlMqttSubscription(sub, this); + return result; +} + +QmlMqttSubscription::QmlMqttSubscription(QSharedPointer<QMqttSubscription> s, QmlMqttClient *c) + : client(c) + , sub(s) +{ + connect(sub.data(), &QMqttSubscription::messageReceived, this, &QmlMqttSubscription::handleMessage); + m_topic = sub->topic(); +} + +QmlMqttSubscription::~QmlMqttSubscription() +{ +} + +void QmlMqttSubscription::handleMessage(const QMqttMessage &qmsg) +{ + emit messageReceived(qmsg.content()); +} diff --git a/examples/mqtt/quicksubscription/qmlmqttclient.h b/examples/mqtt/quicksubscription/qmlmqttclient.h new file mode 100644 index 0000000..1d6d3b5 --- /dev/null +++ b/examples/mqtt/quicksubscription/qmlmqttclient.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLMQTTCLIENT_H +#define QMLMQTTCLIENT_H + +#include <QtCore/QMap> +#include <QtCore/QSharedPointer> +#include <QtMqtt/QMqttClient> +#include <QtMqtt/QMqttSubscription> + +class QmlMqttClient; + +class QmlMqttSubscription : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString topic MEMBER m_topic NOTIFY topicChanged) +public: + QmlMqttSubscription(QSharedPointer<QMqttSubscription> s, QmlMqttClient *c); + ~QmlMqttSubscription(); + +Q_SIGNALS: + void topicChanged(QString); + void messageReceived(const QString &msg); + +public slots: + void handleMessage(const QMqttMessage &qmsg); + +private: + Q_DISABLE_COPY(QmlMqttSubscription) + QSharedPointer<QMqttSubscription> sub; + QmlMqttClient *client; + QString m_topic; +}; + +class QmlMqttClient : public QMqttClient +{ + Q_OBJECT +public: + QmlMqttClient(QObject *parent = nullptr); + + Q_INVOKABLE QmlMqttSubscription *subscribe(const QString &topic); +private: + Q_DISABLE_COPY(QmlMqttClient) +}; + +#endif // QMLMQTTCLIENT_H diff --git a/examples/mqtt/quicksubscription/quicksubscription.pro b/examples/mqtt/quicksubscription/quicksubscription.pro new file mode 100644 index 0000000..71324ac --- /dev/null +++ b/examples/mqtt/quicksubscription/quicksubscription.pro @@ -0,0 +1,32 @@ +TEMPLATE = app + +QT += qml quick mqtt +CONFIG += c++11 + +SOURCES += main.cpp \ + qmlmqttclient.cpp + +HEADERS += \ + qmlmqttclient.h + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +target.path = $$[QT_INSTALL_EXAMPLES]/mqtt/quicksubscription +INSTALLS += target |