注意:不同的Qt版本的MQTT库并不完全一样,头文件也略有区别,需要下载对应版本的MQTT库导入到Qt中。
具体的代码如下,主要实现了订阅和发布的基础功能。
使用MQTT要在。Pro文件中加入“QT +=mqtt”
main.cpp
#include "mqtt.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mqtt.cpp
#include "mqtt.h"
#include "ui_mqtt.h"
#include <QtCore/QDateTime>
#include <QtMqtt/qmqttclient.h>
#include <QtWidgets/QMessageBox>
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->setUsername(ui->lineEditHost_2->text());
m_client->setPassword(ui->lineEditHost_3->text());
m_client->setClientId(ui->lineEditHost_4->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::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(" Received Topic: ")
+ topic.name()
+ QLatin1String(" Message: ")
+ message
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
});
connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
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->lineEditHost_2, &QLineEdit::textChanged, m_client, &QMqttClient::setUsername);
connect(ui->lineEditHost_3, &QLineEdit::textChanged, m_client, &QMqttClient::setPassword);
connect(ui->lineEditHost_4, &QLineEdit::textChanged, m_client, &QMqttClient::setClientId);
connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
updateLogStateChange();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_buttonConnect_clicked()
{
if (m_client->state() == QMqttClient::Disconnected) {
ui->lineEditHost->setEnabled(false);
ui->lineEditHost_2->setEnabled(false);
ui->lineEditHost_3->setEnabled(false);
ui->lineEditHost_4->setEnabled(false);
ui->spinBoxPort->setEnabled(false);
ui->buttonConnect->setText(tr("Disconnect"));
m_client->connectToHost();
} else {
ui->lineEditHost->setEnabled(true);
ui->lineEditHost_2->setEnabled(true);
ui->lineEditHost_3->setEnabled(true);
ui->lineEditHost_4->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()
{
if (m_client->publish(ui->lineEditTopic_2->text(), ui->lineEditMessage->toPlainText().toUtf8()) == -1)
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}
void MainWindow::on_buttonSubscribe_clicked()
{
auto subscription = m_client->subscribe(ui->lineEditTopic->text());
if (!subscription) {
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not subscribe. Is there a valid connection?"));
return;
}
}
void MainWindow::on_buttonSubscribe_2_clicked()
{
ui->editLog->clear();
}
main.h
#ifndef MQTT_H
#define MQTT_H
#include <QMainWindow>
#include <QtMqtt/qmqttclient.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void setClientPort(int p);
private slots:
void on_buttonConnect_clicked();
void on_buttonQuit_clicked();
void updateLogStateChange();
void brokerDisconnected();
void on_buttonPublish_clicked();
void on_buttonSubscribe_clicked();
void on_buttonSubscribe_2_clicked();
private:
Ui::MainWindow *ui;
QMqttClient *m_client;
};
#endif // MAINWINDOW_H
界面如下
代码参考Qt官方文档
工程链接如下:
链接:https://pan.baidu.com/s/1tAgykj7I6hdpYwa72Y0f6w?pwd=ltwv
提取码:ltwv