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();
}));
}
}