Как передать синглтон другому классу в qt - PullRequest
0 голосов
/ 07 февраля 2019

В main.cpp я создаю класс типа singleton для использования его в 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 в качестве аргумента.По крайней мере, это дает ошибку в void loadLanguage(QString language, QObject*(QQmlEngine*,QJSEngine*) objDataloop); в определении qmlTranslator.

От общественности: члены 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;
    }

1 Ответ

0 голосов
/ 07 февраля 2019

DataloopWrapper::qmlInstance - это функция , которую вам нужно вызвать , чтобы получить указатель на QObject.

для любой функции, которую выесли вы хотите передать этот объект, вам нужно заставить его принять указатель на QObject (тип QObject*), и не забудьте вызвать DataloopWrapper::qmlInstance.


Переведено в код:

class QmlTranslator : public QObject
{
    ...
    void loadLanguage(QString language, QObject* objDataloop);
    ...
};

...

qmlTranslator.loadLanguage(lang, DataloopWrapper::qmlInstance(aQMLEngineObjectPointer, aQJSEnginePointer));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...