diff options
author | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2017-03-23 08:04:20 +0100 |
---|---|---|
committer | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2017-03-23 08:04:20 +0100 |
commit | 8bda237fa005e802f2f9b35a2d3d397612fc5885 (patch) | |
tree | 81b6fa152d52ac7501a69b2f46879b24cc750754 /examples | |
parent | 622b0fa96240956b7b360c93be8a03f7bf1fff0b (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.pro | 4 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/main.cpp | 11 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/mainwindow.cpp | 115 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/mainwindow.h | 39 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/mainwindow.ui | 190 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/subscriptions.pro | 27 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/subscriptionwindow.cpp | 47 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/subscriptionwindow.h | 27 | ||||
-rw-r--r-- | examples/mqtt/subscriptions/subscriptionwindow.ui | 63 |
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> |