如何使用GitHub Project Mosqtitto中使用MQTTCLIENTINGLETONCLASS
How to use MqttClientSingletonClass from GitHub Project MosQtitto?
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();
,毕竟已删除了
如果要将其注册为单身人士,可用于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类型并感到高兴...
不要忘记
callsingletonProvider
的返回类型是QObject*
。因此,请确保返回的值是QObject*
类型。这意味着您需要继承QObject
,并且需要使用类中的Q_OBJECT
宏才能使其正常工作。另外,您需要创建Q_PROPERTIES
来访问值和Q_INVOCABLES
,以使函数可从qml
您可以使用两个实例使用单例对象:
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;});
- 没有找到相关文章