如何在 qt 中将单例传递给另一个类

How to pass a singleton to another class in qt

本文关键字:另一个 单例传 qt      更新时间:2023-10-16

main.cpp中,我正在创建一个类的单例类型,以在qml中使用以下函数使用它:

qmlRegisterSingletonType<DataloopWrapper>("com.xpto.connector", 1, 0, "DataloopWrapper",&DataloopWrapper::qmlInstance);

main.cpp我调用另一个对象的函数时,我想从该singleton调用函数

也许像这样的事情qmlTranslator.loadLanguage(lang, DataloopWrapper::qmlInstance);是可能的?

我通过以下方式声明QmlTranslator类:

#ifndef QMLTRANSLATOR_H
#define QMLTRANSLATOR_H
#include <QObject>
#include <QTranslator>
#include <QQmlEngine>
#include <QGuiApplication>
class QmlTranslator : public QObject
{
    Q_OBJECT
public:
    QmlTranslator(QQmlEngine *engine, QGuiApplication *app);
    Q_INVOKABLE void selectLanguage(QString language);
    void InstallTranslator();
    void loadLanguage(QString language, QObject*(QQmlEngine*,QJSEngine*) objDataloop);
    virtual ~QmlTranslator();
signals:
    void languageChanged();
private:
    QTranslator *_translator;
    QQmlEngine *_engine;
    QGuiApplication *_app;
};

#endif // QMLTRANSLATOR_H

我没有找到一种方法来传递DataloopWrapper::qmlInstance作为论据。至少它在 qmlTranslator 定义上void loadLanguage(QString language, QObject*(QQmlEngine*,QJSEngine*) objDataloop);错误。

来自公众:DataloopWrapper的成员我有qmlInstance的辩护,它是这样的:

class DataloopWrapper : public QObject, public something::DataloopCBHandler,
                        public something::DataloopTransferCBHandler
{
    Q_OBJECT
public:
    explicit DataloopWrapper(QObject *parent = nullptr);
    virtual ~DataloopWrapper();
    static QObject *qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine)
    {
        Q_UNUSED(engine);
        Q_UNUSED(scriptEngine);
        return new DataloopWrapper;
    }
DataloopWrapper::qmlInstance是一个

函数,您需要调用它才能获得指向QObject的指针。

对于要传递此对象的任何函数,您需要使其接受指向QObject的指针(类型 QObject* (,并且不要忘记调用 DataloopWrapper::qmlInstance


翻译成代码:

class QmlTranslator : public QObject
{
    ...
    void loadLanguage(QString language, QObject* objDataloop);
    ...
};
...
qmlTranslator.loadLanguage(lang, DataloopWrapper::qmlInstance(aQMLEngineObjectPointer, aQJSEnginePointer));