在之前的文章中花了很多內容去做一般性的分析,但是我們始終有個疑惑,就是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的內部測試代碼才能夠看通這裏