Qt Quick 订阅

使用 Qt Quick 控件创建一个可以订阅 MQTT 主题的应用程序。

Qt Quick 订阅 展示了如何将 QMqttClient 注册为 QML 类型并在 Qt Quick 应用程序中使用它。

Qt MQTT 现阶段版本中不提供 QML API。然而,您可以使得该模块的 C++ 类对 QML 可用。

创建一个客户端

连接到 QMqttSubscription::messageReceived() 以接收发送给经纪人的所有消息

QmlMqttSubscription::QmlMqttSubscription(QMqttSubscription *s, QmlMqttClient *c)
    : sub(s)
    , client(c)
{
    connect(sub, &QMqttSubscription::messageReceived, this, &QmlMqttSubscription::handleMessage);
    m_topic = sub->topic();
}

使用 QMqttClient 类作为基类创建一个 QmlMqttClient

QmlMqttClient::QmlMqttClient(QObject *parent)
    : QObject(parent)
{
    connect(&m_client, &QMqttClient::hostnameChanged, this, &QmlMqttClient::hostnameChanged);
    connect(&m_client, &QMqttClient::portChanged, this, &QmlMqttClient::portChanged);
    connect(&m_client, &QMqttClient::stateChanged, this, &QmlMqttClient::stateChanged);
}

使用 subscribe() 函数创建一个订阅对象

QmlMqttSubscription* QmlMqttClient::subscribe(const QString &topic)
{
    auto sub = m_client.subscribe(topic, 0);
    auto result = new QmlMqttSubscription(sub, this);
    return result;
}

使用一个 QMqttMessage 对象来存储接收到的消息的有效载荷

void QmlMqttSubscription::handleMessage(const QMqttMessage &qmsg)
{
    emit messageReceived(qmsg.payload());
}

在 QML 中注册类

main.cpp 文件中,从订阅模块加载 QML 类型 Main

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QObject::connect(
            &engine, &QQmlApplicationEngine::objectCreationFailed, &app,
            []() { QCoreApplication::exit(EXIT_FAILURE); }, Qt::QueuedConnection);

    engine.loadFromModule(u"subscription"_s, u"Main"_s);

现在在 Main.qml 文件中使用 MqttClient 类型创建 MQTT 客户端

    MqttClient {
        id: client
        hostname: hostnameField.text
        port: portField.text
    }

文件

© 2024 Qt 公司有限公司。此处包含的文档贡献者是各自所有者的版权所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证第 1.3 版 许可的。Qt 以及相关标志是芬兰的 Qt 公司及其在全世界其他国家的商标。所有其他商标均为其各自所有者的财产。