如何使用GitHub Project Mosqtitto中使用MQTTCLIENTINGLETONCLASS

How to use MqttClientSingletonClass from GitHub Project MosQtitto?

本文关键字:MQTTCLIENTINGLETONCLASS Mosqtitto 何使用 GitHub Project      更新时间:2023-10-16

i'am试图用alepez的github项目mosqtitto弄清楚如何实现多个mqttclients。

https://github.com/alepez/mosqtitto

使用mqttclient类创建一个客户端,但我不知道如何使用mqttclientsingleton类在main.qml中创建多个客户端(app.qml项目中的app.qml)。

mqttclientsingleton.hpp

    #ifndef MQTTCLIENTSINGLETON_HPP
    #define MQTTCLIENTSINGLETON_HPP
    #include "MqttClient.hpp"
    class MqttClientSingleton {
    public:
      static MqttClient* get();
      static void set(MqttClient*);
    };
    #endif // MQTTCLIENTSINGLETON_HPP

mqttclientsingleton.cpp

    #include "MqttClientSingleton.hpp"
    #include <QDebug>
    static MqttClient* instance{nullptr};
    MqttClient* MqttClientSingleton::get() {
      return instance;
    }
    void MqttClientSingleton::set(MqttClient* newInstance) {
      instance = newInstance;
    }

我认为该课程必须在

上注册

qmlregistersingletontype

在main.qml中使用它。有人知道如何注册它以及如何用它实施多个客户吗?

我是Mosqtitto的作者。当您想要多个实例时,MqttClient是要使用的正确类。MqttClientSingleton的存在仅具有一个实例(和一个TCP连接),同时在QML和C 中使用。

仅当您需要一个实例,即QML和C 代码之间共享的实例,就可以使用Singleton。这是我写的QT插件的摘录:

void MyPlugin::initializeEngine(QQmlEngine* engine, const char* uri) {
  Q_UNUSED(engine);
  Q_UNUSED(uri);
  /* First, instantiate MQTT Singleton */
  MqttClientSingleton::set(new MqttClient{});
  engine->setObjectOwnership(MqttClientSingleton::get(), QQmlEngine::CppOwnership);
}
void MyPlugin::registerTypes(const char* uri) {
  Q_UNUSED(uri);
  qmlRegisterSingletonType<MqttClient>(uri, 1, 0, "MqttClientSingleton", [](QQmlEngine*, QJSEngine*) -> QObject* {
    return MqttClientSingleton::get();
  });

如果您不需要插件,请创建实例并在主函数上注册类型,如项目中的main.cpp示例。

在实例化任何 mqttclient 之前,请确保调用 mosquitto_lib_init();,并在程序结束时调用 mosquitto_lib_cleanup();,毕竟已删除了

,毕竟 mqttclient 实例已被删除。

如果要将其注册为单身人士,可用于QML,呼叫为

int qmlRegisterSingletonType<T>(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(* ) ( QQmlEngine *, QJSEngine * ) callback)

如文档中所述。

因此,对于您的班级来说,可能是这样的:

qmlRegisterSingletonType<MqttClientSingleton>("MqttClientSingleton", 1, 0, "MqttClientSingleton", MqttClientSingleton::singletonProvider);

此呼叫的最后一部分是指向具有特定签名的方法的功能指针:

static QObject* singletonProvider(QQmlEngine*, QJSEngine*)

此方法应返回实例。所以你可以写

QObject* MqttClientSingleton::singletonProvider(QQmlEngine*, QJSEngine*)
{
    return MqttClientSingleton::instance();
}

但在您问题的第二部分中:

以及如何用它实现多个客户?

我需要说 - 我不知道MqttClientSingleton的详细信息,但是由于它是 Singleton 这是不可能的。Singleton的全部目的是,您可以始终将其视为理所当然,而此类只有一个实例。因此,您不能有多个实例。如果您不需要Mulitple客户的多个实例 - 那么它可能会起作用。

如果您可以访问代码,您可能会看到,如果您可以重构以摆脱单例,请将其注册为常见的QML类型并感到高兴...

不要忘记singletonProvider的返回类型是QObject*。因此,请确保返回的值是QObject*类型。这意味着您需要继承QObject,并且需要使用类中的Q_OBJECT宏才能使其正常工作。另外,您需要创建Q_PROPERTIES来访问值和Q_INVOCABLES,以使函数可从qml

call

您可以使用两个实例使用单例对象:

QObject* MqttClientSingleton::singletonProvider(QQmlEngine*, QJSEngine*)
{
    return MqttClientSingleton::instance();
}

QObject* MqttClientSingleton::singletonProvider2(QQmlEngine*, QJSEngine*)
{
    return MqttClientSingleton::instance2();
}

并声明

qmlRegisterSingletonType<MqttClientSingleton>("MqttClientSingleton1", 1, 0, "MqttClientSingleton1", MqttClientSingleton::singletonProvider);
qmlRegisterSingletonType<MqttClientSingleton>("MqttClientSingleton2", 1, 0, "MqttClientSingleton2", MqttClientSingleton::singletonProvider2);

这是一个非常好的提示:有时我将普通的C 对象称为singleton qml对象(使用C 11 lambda声明),以共享qml中的C 类别:

static classname *static_pointer=&non_singleton_QObject;
qmlRegisterSingletonType<classname>("ClassName", 1, 0, "ClassName", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine) Q_UNUSED(scriptEngine) return static_pointer;});

那么,很容易拥有一个或多个共享对象:

static classname *static_pointer1=&non_singleton_QObject1;
static classname *static_pointer2=&non_singleton_QObject2;
static classname *static_pointer3=&non_singleton_QObject3;
qmlRegisterSingletonType<classname>("ClassName1", 1, 0, "ClassName1", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine) Q_UNUSED(scriptEngine) return static_pointer1;});
qmlRegisterSingletonType<classname>("ClassName2", 1, 0, "ClassName2", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine) Q_UNUSED(scriptEngine) return static_pointer2;});
qmlRegisterSingletonType<classname>("ClassName3", 1, 0, "ClassName3", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine) Q_UNUSED(scriptEngine) return static_pointer3;});
相关文章:
  • 没有找到相关文章