summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorMaurice Kalinowski <maurice.kalinowski@qt.io>2017-03-23 08:04:20 +0100
committerMaurice Kalinowski <maurice.kalinowski@qt.io>2017-03-23 08:04:20 +0100
commit8bda237fa005e802f2f9b35a2d3d397612fc5885 (patch)
tree81b6fa152d52ac7501a69b2f46879b24cc750754 /examples
parent622b0fa96240956b7b360c93be8a03f7bf1fff0b (diff)
Add initial support for QMqttSubscription
The class handles all subscription related items. Developers can use it to manage the state of the subscription. Having a subscription object simplifies message handling, there is no need to do a topic check for each message received.
Diffstat (limited to 'examples')
-rw-r--r--examples/mqtt/mqtt.pro4
-rw-r--r--examples/mqtt/subscriptions/main.cpp11
-rw-r--r--examples/mqtt/subscriptions/mainwindow.cpp115
-rw-r--r--examples/mqtt/subscriptions/mainwindow.h39
-rw-r--r--examples/mqtt/subscriptions/mainwindow.ui190
-rw-r--r--examples/mqtt/subscriptions/subscriptions.pro27
-rw-r--r--examples/mqtt/subscriptions/subscriptionwindow.cpp47
-rw-r--r--examples/mqtt/subscriptions/subscriptionwindow.h27
-rw-r--r--examples/mqtt/subscriptions/subscriptionwindow.ui63
9 files changed, 522 insertions, 1 deletions
diff --git a/examples/mqtt/mqtt.pro b/examples/mqtt/mqtt.pro
index 48c182b..081e393 100644
--- a/examples/mqtt/mqtt.pro
+++ b/examples/mqtt/mqtt.pro
@@ -1,2 +1,4 @@
TEMPLATE = subdirs
-SUBDIRS += simpleclient
+SUBDIRS += \
+ simpleclient \
+ subscriptions
diff --git a/examples/mqtt/subscriptions/main.cpp b/examples/mqtt/subscriptions/main.cpp
new file mode 100644
index 0000000..b48f94e
--- /dev/null
+++ b/examples/mqtt/subscriptions/main.cpp
@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+
+ return a.exec();
+}
diff --git a/examples/mqtt/subscriptions/mainwindow.cpp b/examples/mqtt/subscriptions/mainwindow.cpp
new file mode 100644
index 0000000..d9698a1
--- /dev/null
+++ b/examples/mqtt/subscriptions/mainwindow.cpp
@@ -0,0 +1,115 @@
+#include "mainwindow.h"
+#include "subscriptionwindow.h"
+#include "ui_mainwindow.h"
+
+#include <QtCore/QDateTime>
+#include <QtMqtt/QMqttClient>
+
+MainWindow::MainWindow(QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+
+ m_client = new QMqttClient(this);
+ m_client->setHostname(ui->lineEditHost->text());
+ m_client->setPort(ui->spinBoxPort->value());
+
+ connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
+ connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);
+
+ connect(m_client, &QMqttClient::subscribed, this, [this]() {
+ const QString content = QDateTime::currentDateTime().toString()
+ + QLatin1String("Subscription Succeeded")
+ + QLatin1Char('\n');
+ ui->editLog->insertPlainText(content);
+ });
+
+ connect(m_client, &QMqttClient::messageReceived, this, [this](const QString &topic, const QString &message) {
+ const QString content = QDateTime::currentDateTime().toString()
+ + QLatin1String(" Received Topic: ")
+ + topic
+ + QLatin1String(" Message: ")
+ + message
+ + QLatin1Char('\n');
+ ui->editLog->insertPlainText(content);
+ });
+
+ connect(m_client, &QMqttClient::pingResponse, this, [this]() {
+ ui->buttonPing->setEnabled(true);
+ const QString content = QDateTime::currentDateTime().toString()
+ + QLatin1String(" PingResponse")
+ + QLatin1Char('\n');
+ ui->editLog->insertPlainText(content);
+ });
+
+ connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
+ connect(ui->spinBoxPort, SIGNAL(valueChanged(int)), this, SLOT(setClientPort(int)));
+ updateLogStateChange();
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+ qApp->quit();
+}
+
+void MainWindow::on_buttonConnect_clicked()
+{
+ if (m_client->state() == QMqttClient::Disconnected) {
+ ui->lineEditHost->setEnabled(false);
+ ui->spinBoxPort->setEnabled(false);
+ ui->buttonConnect->setText(tr("Disconnect"));
+ m_client->connectToHost();
+ } else {
+ ui->lineEditHost->setEnabled(true);
+ ui->spinBoxPort->setEnabled(true);
+ ui->buttonConnect->setText(tr("Connect"));
+ m_client->disconnectFromHost();
+ }
+}
+
+void MainWindow::on_buttonQuit_clicked()
+{
+ QApplication::quit();
+}
+
+void MainWindow::updateLogStateChange()
+{
+ const QString content = QDateTime::currentDateTime().toString()
+ + QLatin1String(": State Change")
+ + QString::number(m_client->state())
+ + QLatin1Char('\n');
+ ui->editLog->insertPlainText(content);
+}
+
+void MainWindow::brokerDisconnected()
+{
+ ui->lineEditHost->setEnabled(true);
+ ui->spinBoxPort->setEnabled(true);
+ ui->buttonConnect->setText(tr("Connect"));
+}
+
+void MainWindow::setClientPort(int p)
+{
+ m_client->setPort(p);
+}
+
+void MainWindow::on_buttonPublish_clicked()
+{
+ m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text());
+}
+
+void MainWindow::on_buttonSubscribe_clicked()
+{
+ auto subscription = m_client->subscribe(ui->lineEditTopic->text());
+ auto subWindow = new SubscriptionWindow(subscription);
+ subWindow->setWindowTitle(subscription->topic());
+ subWindow->show();
+}
+
+void MainWindow::on_buttonPing_clicked()
+{
+ ui->buttonPing->setEnabled(false);
+ m_client->requestPing();
+}
diff --git a/examples/mqtt/subscriptions/mainwindow.h b/examples/mqtt/subscriptions/mainwindow.h
new file mode 100644
index 0000000..4120cf1
--- /dev/null
+++ b/examples/mqtt/subscriptions/mainwindow.h
@@ -0,0 +1,39 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QTcpSocket>
+#include <QtMqtt/QMqttClient>
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private slots:
+ void on_buttonConnect_clicked();
+ void on_buttonQuit_clicked();
+ void updateLogStateChange();
+
+ void brokerDisconnected();
+ void setClientPort(int p);
+
+ void on_buttonPublish_clicked();
+
+ void on_buttonSubscribe_clicked();
+
+ void on_buttonPing_clicked();
+
+private:
+ Ui::MainWindow *ui;
+ QMqttClient *m_client;
+};
+
+#endif // MAINWINDOW_H
diff --git a/examples/mqtt/subscriptions/mainwindow.ui b/examples/mqtt/subscriptions/mainwindow.ui
new file mode 100644
index 0000000..b67b6c2
--- /dev/null
+++ b/examples/mqtt/subscriptions/mainwindow.ui
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>629</width>
+ <height>595</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="lineEditHost">
+ <property name="text">
+ <string>hostprocess.de</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="spinBoxPort">
+ <property name="maximum">
+ <number>99999</number>
+ </property>
+ <property name="value">
+ <number>1883</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonConnect">
+ <property name="text">
+ <string>Connect</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="lineEditTopic">
+ <property name="text">
+ <string>qtmqtt/topic1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Topic:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Message:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="buttonPublish">
+ <property name="text">
+ <string>Publish</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="buttonSubscribe">
+ <property name="text">
+ <string>Subscribe</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lineEditMessage">
+ <property name="text">
+ <string>This is a test message</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="buttonPing">
+ <property name="text">
+ <string>Ping</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Log Messages</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QPlainTextEdit" name="editLog"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonQuit">
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>629</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionQuit"/>
+ </widget>
+ <addaction name="menuFile"/>
+ </widget>
+ <widget class="QToolBar" name="mainToolBar">
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ <action name="actionQuit">
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/mqtt/subscriptions/subscriptions.pro b/examples/mqtt/subscriptions/subscriptions.pro
new file mode 100644
index 0000000..cd24d4b
--- /dev/null
+++ b/examples/mqtt/subscriptions/subscriptions.pro
@@ -0,0 +1,27 @@
+QT += core gui network widgets mqtt
+
+TARGET = mqttsubscriptions
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked as 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
+
+
+SOURCES += main.cpp\
+ mainwindow.cpp \
+ subscriptionwindow.cpp
+
+HEADERS += mainwindow.h \
+ subscriptionwindow.h
+FORMS += mainwindow.ui \
+ subscriptionwindow.ui
+
+target.path = $$[QT_INSTALL_EXAMPLES]/mqtt/subscriptions
+INSTALLS += target
diff --git a/examples/mqtt/subscriptions/subscriptionwindow.cpp b/examples/mqtt/subscriptions/subscriptionwindow.cpp
new file mode 100644
index 0000000..d911ddd
--- /dev/null
+++ b/examples/mqtt/subscriptions/subscriptionwindow.cpp
@@ -0,0 +1,47 @@
+#include "subscriptionwindow.h"
+#include "ui_subscriptionwindow.h"
+
+SubscriptionWindow::SubscriptionWindow(QSharedPointer<QMqttSubscription> &sub, QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::SubscriptionWindow)
+{
+ m_sub = sub;
+ ui->setupUi(this);
+
+ ui->labelSub->setText(m_sub->topic());
+ updateStatus(m_sub->state());
+ connect(m_sub.data(), &QMqttSubscription::messageReceived, this, &SubscriptionWindow::updateMessage);
+ connect(m_sub.data(), &QMqttSubscription::stateChanged, this, &SubscriptionWindow::updateStatus);
+ connect(ui->pushButton, &QAbstractButton::clicked, m_sub.data(), &QMqttSubscription::unsubscribe);
+}
+
+SubscriptionWindow::~SubscriptionWindow()
+{
+ delete ui;
+}
+
+void SubscriptionWindow::updateMessage(const QString &text)
+{
+ ui->listWidget->addItem(text);
+}
+
+void SubscriptionWindow::updateStatus(QMqttSubscription::SubscriptionState state)
+{
+ switch (state) {
+ case QMqttSubscription::Unsubscribed:
+ ui->labelStatus->setText(QLatin1String("Unsubscribed"));
+ break;
+ case QMqttSubscription::Pending:
+ ui->labelStatus->setText(QLatin1String("Pending"));
+ break;
+ case QMqttSubscription::Subscribed:
+ ui->labelStatus->setText(QLatin1String("Subscribed"));
+ break;
+ case QMqttSubscription::Error:
+ ui->labelStatus->setText(QLatin1String("Error"));
+ break;
+ default:
+ ui->labelStatus->setText(QLatin1String("--Unknown--"));
+ break;
+ }
+}
diff --git a/examples/mqtt/subscriptions/subscriptionwindow.h b/examples/mqtt/subscriptions/subscriptionwindow.h
new file mode 100644
index 0000000..79e37e7
--- /dev/null
+++ b/examples/mqtt/subscriptions/subscriptionwindow.h
@@ -0,0 +1,27 @@
+#ifndef SUBSCRIPTIONWINDOW_H
+#define SUBSCRIPTIONWINDOW_H
+
+#include <QWidget>
+#include <QtMqtt/QMqttSubscription>
+
+namespace Ui {
+class SubscriptionWindow;
+}
+
+class SubscriptionWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit SubscriptionWindow(QSharedPointer<QMqttSubscription> &sub, QWidget *parent = 0);
+ ~SubscriptionWindow();
+
+public slots:
+ void updateMessage(const QString &text);
+ void updateStatus(QMqttSubscription::SubscriptionState state);
+private:
+ QSharedPointer<QMqttSubscription> m_sub;
+ Ui::SubscriptionWindow *ui;
+};
+
+#endif // SUBSCRIPTIONWINDOW_H
diff --git a/examples/mqtt/subscriptions/subscriptionwindow.ui b/examples/mqtt/subscriptions/subscriptionwindow.ui
new file mode 100644
index 0000000..46ca75f
--- /dev/null
+++ b/examples/mqtt/subscriptions/subscriptionwindow.ui
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SubscriptionWindow</class>
+ <widget class="QWidget" name="SubscriptionWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Subscription:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="labelSub">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="labelStatus">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QListWidget" name="listWidget"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton">
+ <property name="text">
+ <string>Unsubscribe</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>