1. 创建Qt工程
首先,创建一个新的Qt应用程序工程。在Qt Creator中选择"File" -> "New File or Project" -> "Application" -> "Qt Widgets Application",然后按照向导指导进行操作,命名你的项目并选择保存位置。
2. 添加MQTT依赖
确保在你的项目文件(例如.pro
文件)中添加MQTT相关的依赖。在.pro
文件中添加以下行:
QT += mqtt
这将确保你的项目可以使用Qt提供的MQTT功能。
3. 编写MainWindow类
在项目中的主窗口类(通常是MainWindow类)中编写与MQTT相关的代码。
头文件(mainwindow.h)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtMqtt/QMqttClient>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
private slots:
void connectToMqttBroker();
void disconnectFromMqttBroker();
void publishMessage();
void mqttStateChanged(QMqttClient::ClientState state);
void messageReceived(const QByteArray &message, const QMqttTopicName &topic);
private:
QMqttClient *mqttClient;
QTextEdit *logTextEdit;
QLineEdit *topicLineEdit;
QLineEdit *messageLineEdit;
QPushButton *connectButton;
QPushButton *disconnectButton;
QPushButton *publishButton;
};
#endif // MAINWINDOW_H
源文件(mainwindow.cpp)
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setWindowTitle("MQTT 客户端");
mqttClient = new QMqttClient(this);
connectButton = new QPushButton("连接", this);
connect(connectButton, &QPushButton::clicked, this, &MainWindow::connectToMqttBroker);
disconnectButton = new QPushButton("断开连接", this);
connect(disconnectButton, &QPushButton::clicked, this, &MainWindow::disconnectFromMqttBroker);
disconnectButton->setEnabled(false);
publishButton = new QPushButton("发布消息", this);
connect(publishButton, &QPushButton::clicked, this, &MainWindow::publishMessage);
publishButton->setEnabled(false);
topicLineEdit = new QLineEdit(this);
topicLineEdit->setPlaceholderText("输入主题");
messageLineEdit = new QLineEdit(this);
messageLineEdit->setPlaceholderText("输入消息");
logTextEdit = new QTextEdit(this);
logTextEdit->setReadOnly(true);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(topicLineEdit);
layout->addWidget(messageLineEdit);
layout->addWidget(connectButton);
layout->addWidget(disconnectButton);
layout->addWidget(publishButton);
layout->addWidget(logTextEdit);
QWidget *centralWidget = new QWidget(this);
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
connect(mqttClient, &QMqttClient::stateChanged, this, &MainWindow::mqttStateChanged);
connect(mqttClient, &QMqttClient::messageReceived, this, &MainWindow::messageReceived);
}
void MainWindow::connectToMqttBroker()
{
mqttClient->setHostname("MQTT代理地址");
mqttClient->setPort(1883); // MQTT 代理端口
mqttClient->connectToHost();
connectButton->setEnabled(false);
disconnectButton->setEnabled(true);
publishButton->setEnabled(true);
}
void MainWindow::disconnectFromMqttBroker()
{
mqttClient->disconnectFromHost();
connectButton->setEnabled(true);
disconnectButton->setEnabled(false);
publishButton->setEnabled(false);
}
void MainWindow::publishMessage()
{
QString topic = topicLineEdit->text();
QString message = messageLineEdit->text();
mqttClient->publish(QMqttTopicName(topic), message.toUtf8(), 0);
}
void MainWindow::mqttStateChanged(QMqttClient::ClientState state)
{
switch (state) {
case QMqttClient::Disconnected:
logTextEdit->append("与 MQTT 代理断开连接");
break;
case QMqttClient::Connecting:
logTextEdit->append("正在连接到 MQTT 代理...");
break;
case QMqttClient::Connected:
logTextEdit->append("已连接到 MQTT 代理");
break;
case QMqttClient::Error:
logTextEdit->append("连接 MQTT 代理时发生错误");
break;
default:
break;
}
}
void MainWindow::messageReceived(const QByteArray &message, const QMqttTopicName &topic)
{
QString msg = "收到消息:" + message + ",来自主题:" + topic.name();
logTextEdit->append(msg);
}
4. 运行项目
保存并编译你的项目,然后运行。你将看到一个基本的窗口,可以连接到MQTT代理,发布消息,并显示连接状态和接收的消息。
注意事项
- 替换代码中的"MQTT代理地址"为你的MQTT代理地址。
- 这个示例中使用了Qt的信号槽机制来处理按钮点击事件和MQTT客户端状态变化事件。
- 可以根据需要进一步扩展功能,如订阅主题、处理更复杂的消息等。
通过以上步骤,你可以成功地创建一个使用MQTT的Qt窗口和控件,用于连接到MQTT代理并与之通信。