QWebChannel之QJSEngine調用js解析

在之前的文章中花了很多內容去做一般性的分析,但是我們始終有個疑惑,就是C++與js究竟如何調用的。由於時間關係,這裏僅做一個結論性的筆記。

QWebChannel使用的主要原理是:C++類實例化後,註冊到元對象系統,然後暴露給html,進而相互通信。

1、QWebChannel

QWebChannel主要是通過QMetaObjectPublisher將一個C++的類壓縮(暫且稱作壓縮)爲json格式,並且把接口暴露出去。這裏的壓縮是提取C++類中的函數、信號、槽函數全部特徵都寫入到一個json結構中,這是第一步。

這裏的暴露是相對於QJSEngine而言的,把上一步獲取到json暴露給QJSEngine。

2、QJSEngine

QJSEngine作用就很簡單了,主要是Qt的js引擎,執行js代碼,不做過多敘述。

3、調用js解析

void TestEngineTransport::sendMessage(const QJsonObject &message)
{
    //C++方法轉換爲JS方法的關鍵
    QByteArray json = QJsonDocument(message).toJson(QJsonDocument::Compact);
    QJSValue callback = m_testEngine->evaluate(QStringLiteral("transport.onmessage"));
    Q_ASSERT(callback.isCallable());
    QJSValue arg = m_testEngine->newObject();
    QJSValue data = m_testEngine->evaluate(QString::fromLatin1("JSON.parse('%1');").arg(QString::fromUtf8(json)));
    Q_ASSERT(!data.isError());
    arg.setProperty(QStringLiteral("data"), data);
    QJSValue val = callback.call((QJSValueList() << arg));
    Q_ASSERT(!val.isError());
}

注意上述QByteArray json = QJsonDocument(message).toJson(QJsonDocument::Compact);這句,這裏是關鍵,需要參考Qt的內部測試代碼才能夠看通這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章