Qt 快速出版

使用 Qt 快速控件创建一个可以在 MQTT 主题上发布的应用程序。

Qt 快速出版演示了如何将 QMqttClient 注册为 QML 类型并在 Qt Quick 应用程序中使用它。

Qt MQTT 在其当前版本中不提供 QML API。但是,您可以使该模块的 C++ 类对于 QML 可用。

创建客户端

创建具有 QMqttClient 成员的自定义包装类 QmlMqttClient

private:
    Q_DISABLE_COPY(QmlMqttClient)
    QMqttClient m_client;
};

在构造函数中连接包装方法到 QMqttClient 的方法

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);
}

包装方法具有与包装方法相同的名称。在 simplest 情况下,它仅是一个方法调用

void QmlMqttClient::connectToHost()
{
    m_client.connectToHost();
}

也可以通过扩展一些附加功能来自定义包装方法

void QmlMqttClient::setPort(int newPort)
{
    if (newPort < 0 || newPort > std::numeric_limits<quint16>::max()) {
        qWarning() << "Trying to set invalid port number";
        return;
    }
    m_client.setPort(static_cast<quint16>(newPort));

在 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"publication"_s, u"Main"_s);

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

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

文件

© 2024 Qt 公司 Ltd. 有关本文档的贡献版权属于各自的拥有者。本提供文档根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可。Qt 及相关标志是芬兰和/或其他国家/地区的 Qt 公司的商标。所有其他商标均为各自所有者的财产。