QWebChannel Как вернуть пользовательскую структуру данных

На основе объекта передачи qtqwebenginepage::setwebchannel() и QT: невозможно вернуть пользовательскую структуру данных из вызова JavaScript. Мне нужна эта функция, но я не знаю, как это сделать.

      /** this is my data type */
class QDataDictionary {
public:
    QString number;
    QString name;
    QString description;
};

Q_DECLARE_METATYPE(QDataDictionary);

Я надеюсь, что интерфейс сможет вернуть определенные мной данные после обработки соответствующих операций. Ниже приведен мой код реализации C++.

      #ifndef QSYSTEMDICTIONARYMANAGER_H
#define QSYSTEMDICTIONARYMANAGER_H

#include <QObject>
#include "qsystemdatadictionary.h"

class QSystemDictionaryManager : public QObject
{
    Q_OBJECT
public:
    explicit QSystemDictionaryManager(QObject *parent = nullptr);
    virtual ~QSystemDictionaryManager();

signals:

public slots:
    /** I want to return this data structure */
    Q_INVOKABLE QDataDictionary debug(const QString& contents);

public slots:

protected:
};

#endif // QSYSTEMDICTIONARYMANAGER_H

#include "qsystemdictionarymanager.h"
#include <QTextStream>
#include <QMessageBox>

QSystemDictionaryManager::QSystemDictionaryManager(QObject *parent) : QObject(parent)
{

}

QSystemDictionaryManager::~QSystemDictionaryManager() {

}

QDataDictionary data;
QDataDictionary QSystemDictionaryManager::debug(const QString &contents)
{
    QString DebugMessage;
    QTextStream DebugTextStream(&DebugMessage);
    DebugTextStream << this << " " << __LINE__ << " "<< __FUNCTION__ << " == " << contents;
    QMessageBox::information(nullptr, "javascrpt call authenticate", DebugMessage);


    data.number = "256";
    data.name = "___dictionary__";
    data.description = "QSystemDataDictionary";
    return data;
}

Ниже приведен интерфейс, который я вызываю на C++ через JavaScript, но не получаю данные, которые хочу вернуть.

      var SystemDictionaryManager;
        new QWebChannel(qt.webChannelTransport,
            function (channel) {
                SystemDictionaryManager = channel.objects.SystemDictionaryManager;
            });
        var debug = async function (text) {
            if (typeof SystemDictionaryManager !== "undefined") {
                var message = "System Dictionary Manager";
                /** Calling the interface can't get the data I want */
                await new Promise(resolve =>
                    SystemDictionaryManager.debug(message, function (result) {
                        document.getElementById("main").innerHTML = "data is == " + result;
                        resolve();
                    }));
            }
        }

0 ответов

Другие вопросы по тегам