Qt学习|Qt用MQTT协议连接阿里云

编译源码 源码编译参考下面的文章,编译过程可能会有些错误,可以参考文章进行解决
【Qt学习|Qt用MQTT协议连接阿里云】Qt5 使用 Qt官方Qt MQTT_萧海的博客-CSDN博客
界面设计 主界面
Qt学习|Qt用MQTT协议连接阿里云
文章图片

历史连接界面
Qt学习|Qt用MQTT协议连接阿里云
文章图片

listWidgetItem界面
Qt学习|Qt用MQTT协议连接阿里云
文章图片

代码设计

主界面.cpp
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //设置label显示状态 ui->lbShowState->setText("连接状态:Disconnected"); //创建新的客户端 this->m_client = new QMqttClient(this); //打开数据文件文件位置为当前工程 QFile file(".//historyData.json"); //以只读的方式打开文件 bool isOpened = file.open(QIODevice::ReadOnly); //首次建立程序的时候 文件是不存在的所以要进行判断是否能够以只读的方式打开文件 //但是写文件的时候如果文件不存在会自动创建一个文件 if(isOpened) { //创建json文档,从数据文本中读取所有数据 QJsonDocument historyJDocument = QJsonDocument::fromJson(file.readAll()); //通过json文档获取json数组 this->historyJArray = historyJDocument.array(); //关闭文件 file.close(); } else { qDebug() << "文件未打开"; }//点击连接按钮后执行 connect(ui->btnConnect,&QPushButton::clicked,[=](){ if(ui->btnConnect->text() == "连接") { //设置域名 this->m_client->setHostname(ui->leHostname->text()); //设置端口 this->m_client->setPort(ui->lePort->text().toInt()); //设置用户名 this->m_client->setUsername(ui->leUsername->text()); //设置密码 this->m_client->setPassword(ui->lePassword->text()); //设置用户Id this->m_client->setClientId(ui->leClientId->text()); //连接 this->m_client->connectToHost(); } else { //断开连接 this->m_client->disconnectFromHost(); }}); //监听状态变化 //连接成功后 存储连接的信息,如果信息的密码和已有的信息密码相同,则不进行存储 connect(this->m_client,&QMqttClient::stateChanged,[=](QMqttClient::ClientState state){ QString str = ""; switch (state){ case QMqttClient::Disconnected: str = "Disconnected"; //设置按钮显示 ui->btnConnect->setText("连接"); break; case QMqttClient::Connecting: str = "Connecting"; break; case QMqttClient::Connected: str = "Connected"; // bool isAdd = true; for(int i=0; ihistoryJArray.size(); i++) { //用json数组转成json值然后又转成json对象 QJsonObject jObject = historyJArray.at(i).toObject(); QJsonValue jValue = https://www.it610.com/article/jObject.value("Password"); if(jValue.toString() == ui->lePassword->text()) { isAdd = false; break; } } if(isAdd) { //创建文件对象 QFile file(".//historyData.json"); //以读的方式打开文件因为每次都将以前的数据读取存储量起来 //所以用覆盖的方式打开文本 file.open(QIODevice::WriteOnly); //插入数据到json数组 QJsonObject jObject; jObject.insert("Hostname",ui->leHostname->text()); jObject.insert("Port",ui->lePort->text()); jObject.insert("ClientId",ui->leClientId->text()); jObject.insert("Username",ui->leUsername->text()); jObject.insert("Password",ui->lePassword->text()); this->historyJArray.append(jObject); //创建json文档对象并设置json文档对象内容 QJsonDocument jDocument; jDocument.setArray(this->historyJArray); //将json文档对象写入到文档 file.write(jDocument.toJson()); //关闭文件 file.close(); }//设置按钮文本显示 ui->btnConnect->setText("断开"); break; } ui->lbShowState->setText("连接状态:"+str); qDebug() << state; }); //监听客户端的消息变化 connect(this->m_client,&QMqttClient::messageReceived,[=](const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName()){ ui->tbRevMag->append("-------------------------------------"); ui->tbRevMag->append("topic:" + topic.name()); ui->tbRevMag->append("message:" + message); }); //监听客户端错误发生 connect(m_client,&QMqttClient::errorChanged,[=](QMqttClient::ClientError error){ qDebug() << error; }); //发布消息按钮事件 connect(ui->btnPubTopic,&QPushButton::clicked,[=](){ QMqttTopicName name = QMqttTopicName(ui->lePubTopic->text()); QMqttPublishProperties pro = QMqttPublishProperties(); QString publishMessage =ui->tePubMag->toPlainText(); m_client->publish(name,pro,publishMessage.toUtf8()); }); //取消订阅按钮事件 connect(ui->btnUnSubTopic,&QPushButton::clicked,[=](){ m_client->unsubscribe(QMqttTopicFilter(ui->leUnSubTopic->text())); }); //订阅按钮事件 connect(ui->btnSubTopic,&QPushButton::clicked,[=](){ m_client->subscribe(QMqttTopicFilter(ui->leSubTopic->text())); }); //监听历史信息界面选择 //每次进入历史信息前重新获取一遍文本数据因为在历史信息界面可能发生更改 connect(ui->actioncheck,&QAction::triggered,[=](){ //打开数据文件文件位置为当前工程 QFile file(".//historyData.json"); //以只读的方式打开文件 bool isOpened = file.open(QIODevice::ReadOnly); //首次建立程序的时候 文件是不存在的所以要进行判断是否能够以只读的方式打开文件 //但是写文件的时候如果文件不存在会自动创建一个文件 if(isOpened) { //创建json文档,从数据文本中读取所有数据 QJsonDocument historyJDocument = QJsonDocument::fromJson(file.readAll()); //通过json文档获取json数组 this->historyJArray = historyJDocument.array(); //关闭文件 file.close(); } else { qDebug() << "文件未打开"; }historyImfor = new HistoryImfor(this->historyJArray); historyImfor->show(); connect(this->historyImfor,&HistoryImfor::selHistoryImfors,this,&MainWindow::getHisttoryImfors); }); }//信息存储 元素0 hostname 元素1 port元素2 clientId元素3 username元素4 password void MainWindow::getHisttoryImfors(QString imfors[]) { //将选择的历史信息填入到文本框中 ui->leHostname->setText(imfors[0]); ui->lePort->setText(imfors[1]); ui->leClientId->setText(imfors[2]); ui->leUsername->setText(imfors[3]); ui->lePassword->setText(imfors[4]); }MainWindow::~MainWindow() { delete ui; }

主界面.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include #include "QtMqtt/qmqttclient.h" #include "QDebug" #include "QLabel" #include "QFile" #include "QJsonObject" #include "QJsonDocument" #include "QJsonArray" #include "historyimfor.h" #include "QMessageBox"QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow { Q_OBJECTpublic: MainWindow(QWidget *parent = nullptr); ~MainWindow(); QMqttClient *m_client; QJsonArray historyJArray; HistoryImfor *historyImfor; void getHisttoryImfors(QString imfors[]); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

历史界面.cpp
#include "historyimfor.h" #include "ui_historyimfor.h"//HistoryImfor::HistoryImfor(QWidget *parent) : //QMainWindow(parent), //ui(new Ui::HistoryImfor) //{ //ui->setupUi(this); //}//自定义构造函数 HistoryImfor::HistoryImfor(QJsonArray historyJArray): ui(new Ui::HistoryImfor) { ui->setupUi(this); //保存传来的文本信息 供选择的时候使用 this->historyJArray = historyJArray; //设置listwidget的item间隔 ui->lwHistImfor->setSpacing(5); //qDebug() << historyJArray; //获取json中的值 然后放入到listwidget for(int i=0; ilbHostname->setText(jValue.toString()); //获取json值 jValue = https://www.it610.com/article/jObject.value("Port"); //设置到label中 cell->lbPort->setText(jValue.toString()); //获取json值 jValue = https://www.it610.com/article/jObject.value("ClientId"); //设置到label中 cell->lbClientId->setText(jValue.toString()); //获取json值 jValue = https://www.it610.com/article/jObject.value("Username"); //设置到label中 cell->lbUsername->setText(jValue.toString()); //获取json值 jValue = https://www.it610.com/article/jObject.value("Password"); //设置到label中 cell->lbPassword->setText(jValue.toString()); //设置item的大小 item->setSizeHint(QSize(ui->lwHistImfor->width(),cell->height())); //将空item先加入到listwidget中 ui->lwHistImfor->addItem(item); //然后再设置item的窗口 ui->lwHistImfor->setItemWidget(item,cell); }connect(ui->lwHistImfor,&QListWidget::itemClicked,[=](QListWidgetItem *item){}); connect(ui->btnDel,&QPushButton::clicked,[=](){ ui->lwHistImfor->removeItemWidget(ui->lwHistImfor->currentItem()); deleteui->lwHistImfor->currentItem(); int row = ui->lwHistImfor->row(ui->lwHistImfor->currentItem()); this->historyJArray.removeAt(row); QJsonDocument jDocument; jDocument.setArray(this->historyJArray); QFile file(".//historyData.json"); file.open(QIODevice::WriteOnly); file.write(jDocument.toJson()); file.close(); }); connect(ui->btnOpen,&QPushButton::clicked,[=](){ //信息存储 元素0 hostname 元素1 port元素2 clientId元素3 username元素4 password QString imfors[5]; int row = ui->lwHistImfor->row(ui->lwHistImfor->currentItem()); QJsonObject jObject = historyJArray.at(row).toObject(); QJsonValue jValue; //获取json值 jValue = https://www.it610.com/article/jObject.value("Hostname"); //将值存储到数组中 imfors[0] = jValue.toString(); //获取json值 jValue = https://www.it610.com/article/jObject.value("Port"); //将值存储到数组中 imfors[1] = jValue.toString(); //获取json值 jValue = https://www.it610.com/article/jObject.value("ClientId"); //将值存储到数组中 imfors[2] = jValue.toString(); //获取json值 jValue = https://www.it610.com/article/jObject.value("Username"); //将值存储到数组中 imfors[3] = jValue.toString(); //获取json值 jValue = https://www.it610.com/article/jObject.value("Password"); //将值存储到数组中 imfors[4] = jValue.toString(); //选择好信息后 发送信号个主窗口 emit selHistoryImfors(imfors); this->close(); }); }HistoryImfor::~HistoryImfor() { delete ui; }

历史界面.h
#ifndef HISTORYIMFOR_H #define HISTORYIMFOR_H#include #include "QJsonDocument" #include "QJsonArray" #include "QJsonObject" #include "QJsonValue" #include "historycell.h" #include "QListWidgetItem" #include "QDebug" #include "QPainter" #include "QFile"namespace Ui { class HistoryImfor; }class HistoryImfor : public QMainWindow { Q_OBJECTpublic: //explicit HistoryImfor(QWidget *parent = nullptr); HistoryImfor(QJsonArray historyJArray); ~HistoryImfor(); //存储历史信息 QJsonArray historyJArray; private: Ui::HistoryImfor *ui; signals: //选择历史信息后发送信号 void selHistoryImfors(QString imfors[]); }; #endif // HISTORYIMFOR_H

listWidget Item界面.cpp
#include "historycell.h" #include "ui_historycell.h"historyCell::historyCell(QWidget *parent) : QMainWindow(parent), ui(new Ui::historyCell) { ui->setupUi(this); this->lbHostname = ui->lbHostname; this->lbPort = ui->lbPort; this->lbClientId = ui->lbClient; this->lbUsername = ui->lbUsername; this->lbPassword = ui->lbPassword; }historyCell::~historyCell() { delete ui; }

listWidget Item界面.h
#ifndef HISTORYCELL_H #define HISTORYCELL_H#include #include "QLabel"namespace Ui { class historyCell; }class historyCell : public QMainWindow { Q_OBJECTpublic: explicit historyCell(QWidget *parent = nullptr); ~historyCell(); QLabel *lbHostname; QLabel *lbPort; QLabel *lbUsername; QLabel *lbPassword; QLabel *lbClientId; private: Ui::historyCell *ui; }; #endif // HISTORYCELL_H

运行演示 Qt学习|Qt用MQTT协议连接阿里云
文章图片

Qt学习|Qt用MQTT协议连接阿里云
文章图片

Qt学习|Qt用MQTT协议连接阿里云
文章图片

Qt学习|Qt用MQTT协议连接阿里云
文章图片

Qt学习|Qt用MQTT协议连接阿里云
文章图片

Qt学习|Qt用MQTT协议连接阿里云
文章图片


    推荐阅读