Qt用MQTT协议连接阿里云

编译源码

源码编译参考下面的文章,编译过程可能会有些错误,可以参考文章进行解决

Qt5 使用 Qt官方Qt MQTT_萧海的博客-CSDN博客


界面设计

主界面

Qt用MQTT协议连接阿里云_第1张图片

历史连接界面

Qt用MQTT协议连接阿里云_第2张图片

listWidget  Item界面 

Qt用MQTT协议连接阿里云_第3张图片


代码设计

主界面.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 = 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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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 = jObject.value("Port");
        //设置到label中
        cell->lbPort->setText(jValue.toString());

        //获取json值
        jValue = jObject.value("ClientId");
        //设置到label中
        cell->lbClientId->setText(jValue.toString());

        //获取json值
        jValue = jObject.value("Username");
        //设置到label中
        cell->lbUsername->setText(jValue.toString());

        //获取json值
        jValue = 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());
        delete  ui->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 = jObject.value("Hostname");
        //将值存储到数组中
        imfors[0] = jValue.toString();

        //获取json值
        jValue = jObject.value("Port");
        //将值存储到数组中
        imfors[1] = jValue.toString();

        //获取json值
        jValue = jObject.value("ClientId");
        //将值存储到数组中
        imfors[2] = jValue.toString();

        //获取json值
        jValue = jObject.value("Username");
        //将值存储到数组中
        imfors[3] = jValue.toString();

        //获取json值
        jValue = 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_OBJECT

public:
//    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_OBJECT

public:
    explicit historyCell(QWidget *parent = nullptr);
    ~historyCell();

    QLabel *lbHostname;
    QLabel *lbPort;
    QLabel *lbUsername;
    QLabel *lbPassword;
    QLabel *lbClientId;

private:
    Ui::historyCell *ui;
};

#endif // HISTORYCELL_H

运行演示

Qt用MQTT协议连接阿里云_第4张图片

Qt用MQTT协议连接阿里云_第5张图片

Qt用MQTT协议连接阿里云_第6张图片

Qt用MQTT协议连接阿里云_第7张图片

Qt用MQTT协议连接阿里云_第8张图片

Qt用MQTT协议连接阿里云_第9张图片

 

你可能感兴趣的:(Qt学习,qt,阿里云,开发语言)