客戶端與前端交互
- qwebchannel.js文件引入
- 建立通信
// c++發送消息給js
new QWebChannel(qt.webChannelTransport, function(channel){var content = channel.objects.jsContext;// 建立通信后,客戶端通過調用 sMsg 方法來執行后面的回調函數,從而實現c++與js交互content.sMsg.connect(function (str) { // str為客戶端發送來的數據,交互數據一定是字符串格式if(!str) return;var question = typeof str === 'string' ? JSON.parse(str) : JSON.parse(JSON.stringify(str));rMsg(question);});content.cBg.connect(function(data){//C++ 通過jsBridge更改背景色cBg(data);});window.cjs = cjs})
復制代碼
//js調用c++的方法發送消息 window.cjs是初始化new QWebChannel之后綁定在window對象上的cjs。名字前后保持一致
var loadComplate2C = {"type" : "loadComplate","data" : "loadComplate"
};
loadComplate2C = JSON.stringify(loadComplate2C);
window.cjs && window.cjs.jsToQt(loadComplate2C);
復制代碼
遇到的問題
- 時間點問題:new QWebChannel 的時間點一定盡早。在引入qwebchannel.js文件之后,在當前html文件里面。時間點如果不對,很有可能收不到客戶端發送來的數據,因為客戶端會在頁面加載完成后直接發送,而此時如果new QWebChannel在外鏈js文件中,有可能沒來得及執行。
- 參數傳遞問題:傳遞的參數都是string格式!
- 客戶端本地上傳文件拿到絕對路徑,前端不能直接展示,因為chrome的安全策略,不允許前端讀取本地路徑的資源文件。
待完成
查看通信原理qwebchannel.js源代碼,了解js和c++能夠建立通信的原因