编译源码
源码编译参考下面的文章,编译过程可能会有些错误,可以参考文章进行解决
Qt5 使用 Qt官方Qt MQTT_萧海的博客-CSDN博客
界面设计
主界面
历史连接界面
listWidget? Item界面?
代码设计
主界面.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;i<this->historyJArray.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 <QMainWindow>
#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;i<historyJArray.size();i++)
{
QListWidgetItem *item = new QListWidgetItem();
historyCell *cell = new historyCell();
//用json数组转成json值然后又转成json对象
QJsonObject jObject = historyJArray.at(i).toObject();
QJsonValue jValue;
//获取json值
jValue = jObject.value("Hostname");
//设置到label中
cell->lbHostname->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 <QMainWindow>
#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 <QMainWindow>
#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
运行演示
?
|