diff options
author | Pablo J. Rogina <pablojr@gmail.com> | 2018-06-28 15:46:01 -0300 |
---|---|---|
committer | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2018-07-20 12:22:09 +0000 |
commit | ee6eba8a4ba9bb78b21bd25bafef7422edba2eb0 (patch) | |
tree | 4f3058f3148e89d7b0abc2eba88ef426e73ef9e7 /examples | |
parent | de25c6b78dc756af949fc3be5508ba8e33b50a41 (diff) |
Add new QML example to publish topics/messages
New QML-based example that allows to send topic/message (along with QoS
and retain properties) based mainly on existing QML subscription
example, in order to provide a way for showing the whole
publish/subscription model in MQTT via QML applications.
Change-Id: I1673177371297969098adf635e7a582c25e4d0c7
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/mqtt/mqtt.pro | 1 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/main.cpp | 70 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/main.qml | 221 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/qml.qrc | 5 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/qmlmqttclient.cpp | 64 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/qmlmqttclient.h | 68 | ||||
-rw-r--r-- | examples/mqtt/quickpublication/quickpublication.pro | 32 |
7 files changed, 461 insertions, 0 deletions
diff --git a/examples/mqtt/mqtt.pro b/examples/mqtt/mqtt.pro index 767ed5e..c734248 100644 --- a/examples/mqtt/mqtt.pro +++ b/examples/mqtt/mqtt.pro @@ -4,4 +4,5 @@ SUBDIRS += \ subscriptions qtHaveModule(quick): SUBDIRS += quicksubscription +qtHaveModule(quick): SUBDIRS += quickpublication qtHaveModule(websockets): SUBDIRS += websocketsubscription diff --git a/examples/mqtt/quickpublication/main.cpp b/examples/mqtt/quickpublication/main.cpp new file mode 100644 index 0000000..a1bd557 --- /dev/null +++ b/examples/mqtt/quickpublication/main.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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"); + + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff --git a/examples/mqtt/quickpublication/main.qml b/examples/mqtt/quickpublication/main.qml new file mode 100644 index 0000000..b018e68 --- /dev/null +++ b/examples/mqtt/quickpublication/main.qml @@ -0,0 +1,221 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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("Qt Quick MQTT Publish Example") + id: root + + 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: "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: pubField + placeholderText: "<Publication topic>" + } + + Label { + text: "Message:" + } + + TextField { + id: msgField + placeholderText: "<Publication message>" + } + } + + RowLayout { + enabled: client.state === MqttClient.Connected + Layout.columnSpan: 2 + Layout.fillWidth: true + + Label { + text: "QoS:" + } + + ComboBox { + id: qosItems + editable: false + model: [0, 1, 2] + } + + CheckBox { + id: retain + checked: false + text: "Retain" + } + + Button { + id: pubButton + text: "Publish" + onClicked: { + if (pubField.text.length === 0) { + console.log("No payload to send. Skipping publish...") + return + } + client.publish(pubField.text, msgField.text, qosItems.currentText, retain.checked) + addMessage(msgField.text) + } + } + } + + 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/quickpublication/qml.qrc b/examples/mqtt/quickpublication/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/examples/mqtt/quickpublication/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/mqtt/quickpublication/qmlmqttclient.cpp b/examples/mqtt/quickpublication/qmlmqttclient.cpp new file mode 100644 index 0000000..28f69fc --- /dev/null +++ b/examples/mqtt/quickpublication/qmlmqttclient.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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> +#include <QMqttTopicName> + +QmlMqttClient::QmlMqttClient(QObject *parent) + : QMqttClient(parent) +{ +} + +int QmlMqttClient::publish(const QString &topic, const QString &message, int qos, bool retain) +{ + auto result = QMqttClient::publish(QMqttTopicName(topic), message.toUtf8(), qos, retain); + return result; +} diff --git a/examples/mqtt/quickpublication/qmlmqttclient.h b/examples/mqtt/quickpublication/qmlmqttclient.h new file mode 100644 index 0000000..85b6532 --- /dev/null +++ b/examples/mqtt/quickpublication/qmlmqttclient.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 <QtMqtt/QMqttClient> + +class QmlMqttClient : public QMqttClient +{ + Q_OBJECT +public: + QmlMqttClient(QObject *parent = nullptr); + + Q_INVOKABLE int publish(const QString &topic, const QString &message, int qos = 0, bool retain = false); +private: + Q_DISABLE_COPY(QmlMqttClient) +}; + +#endif // QMLMQTTCLIENT_H diff --git a/examples/mqtt/quickpublication/quickpublication.pro b/examples/mqtt/quickpublication/quickpublication.pro new file mode 100644 index 0000000..20bdcc7 --- /dev/null +++ b/examples/mqtt/quickpublication/quickpublication.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/quickpublication +INSTALLS += target |