Qt 使用QAMQP连接RabbitMQ
引言
QAMQP(Qt AMQP Library)是一个基于Qt框架的AMQP(Advanced Message Queuing Protocol)客户端库,用于与消息代理(如RabbitMQ)进行交互。它提供Qt风格的API,支持信号与槽机制,适合在Qt应用程序中实现消息队列功能。RabbitMQ是一个开源的消息代理软件,实现了AMQP协议,用于在分布式系统中异步传递消息。
一、下载安装
QAMQP github主页:https://github.com/mbroadst/qamqp/tree/master
QAMQP gitee版,下载速度快(
推荐):https://gitcode.com/gh_mirrors/qa/qamqpRabbitMQ主页:https://www.rabbitmq.com/
Linux系统下安装RabbitMq超详细教程:https://blog.csdn.net/2401_82767224/article/details/139332828
Windows下安装RabbitMq,可参考Windows 安装以及配置Docker全流程 - Docker Toolbox
- RabbitMQ安装教程有很多,建议直接使用
Docker安装,较方便。 QAMQP更方便,直接下载源码编译即可。
二、测试例程
- 直接使用
QAMQP中tutorials>helloworld>send,增加设置连接参数的代码:
cpp
m_client.setHost("192.168.99.100");
m_client.setPort(5672);
m_client.setUsername("guest");
m_client.setPassword("guest");
m_client.setVirtualHost("/");
m_client.connectToHost();
注:如果在Linux下运行Debug版本,记得修改pro文件linux: QAMQP_LIBS = -lqamqp,因为Linux下好像不支持后缀加d:QAMQP_LIBS = -lqamqpd(MinGW编译器)
- 然后编译运行,打了个断点,测试效果如下,网页显示已连接:

- 运行完后,效果如下 (网页有相关显示):

- 完整源码如下,可直接替换
send项目下的main.cpp:
cpp
#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
#include "qamqpclient.h"
#include "qamqpexchange.h"
#include "qamqpqueue.h"
class Sender : public QObject
{
Q_OBJECT
public:
Sender(QObject *parent = 0) : QObject(parent) {}
public Q_SLOTS:
void start() {
connect(&m_client, SIGNAL(connected()), this, SLOT(clientConnected()));
connect(&m_client, SIGNAL(disconnected()), qApp, SLOT(quit()));
m_client.setHost("192.168.99.100");
m_client.setPort(5672);
m_client.setUsername("guest");
m_client.setPassword("guest");
m_client.setVirtualHost("/");
m_client.connectToHost();
}
private Q_SLOTS:
void clientConnected() {
QAmqpQueue *queue = m_client.createQueue("hello");
connect(queue, SIGNAL(declared()), this, SLOT(queueDeclared()));
queue->declare();
}
void queueDeclared() {
QAmqpQueue *queue = qobject_cast<QAmqpQueue*>(sender());
if (!queue)
return;
QAmqpExchange *defaultExchange = m_client.createExchange();
defaultExchange->publish("Hello World!", "hello");
qDebug() << " [x] Sent 'Hello World!'";
m_client.disconnectFromHost();
}
private:
QAmqpClient m_client;
};
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
Sender sender;
sender.start();
return app.exec();
}
#include "main.moc"
Qt 中为什么有时候要在 cpp 文件的最后加上 #include "main.moc":https://blog.csdn.net/qiangzi4646/article/details/146088756