WebEngineView
如果你使用WebView那么可以看之前的文章通过封装的WebSocket通信;
使用WebEngineView当然也可以,不过略显麻烦,毕竟有了WebChannel;
利用Webchannel 实现Html 与C++相互调用
调用C++交给QMl来完成,从而间接实现;
如果用socket 可以做到直接通信;
WebEngineView {
id:view
width:parent.width
height:parent.height-control.height
url: "qrc:/Html/Login.html"
webChannel: channel.channelId
}
封装的WebChannel
JHWebChannel{
id:channel
transportName:"socket"
////接收html传来的json
onReceivedMessage: {
dealMsg(msg);
}
}
/////通知Html
channel.sendMessage(msg);
接收Html消息处理:
function delaMsg(msg){
var nnn=JSON.parse(msg);
var index=parseInt(nnn.Code);
switch(index){
case 101:
view.url="qrc:/Html/Test.html";
if(nnn.Data.name==="yjh3035@qq.com"&&nnn.Data.pass==="123"){
view.url="qrc:/Html/Test.html";
}
break;
case 102:
var sindex=parseInt(nnn.Data.openPath);
switch(sindex){
case 1:case 2:case 3:case 4:case 5:console.log("openPath:"+sindex);break;
}
break;
}
}
JHWebChannel
Item{
property alias transportId: obj
property alias channelId: channel
property string transportName: "chanel"
signal receivedMessage(string msg);
width:0
height:0
function sendMessage(msg){
obj.notifyHtml(msg);
}
QtObject{
id: obj
WebChannel.id: transportName
signal notifyHtml(string message);
function notifyQML(newText) {
receivedMessage(newText);
}
}
WebChannel {
id: channel
registeredObjects: [obj]
}
}
HTML
引入JS
<script type="text/javascript" src="qrc:///Html/qwebchannel.js"></script>
<script type="text/javascript" src="qrc:///Html/Base.js"></script>
添加脚本:
Base.js
function notify(flag,data){
if(socket){
var dd=JSON.stringify({"Code":flag,"Data":data});
socket.notifyQML(dd);
}
};
function initChannel (callback){
new QWebChannel(qt.webChannelTransport,function(channel){
socket = channel.objects.socket;
socket.notifyHtml.connect(function (message) {
callback(message);
});
});
rturn socket;
};
界面
登录成功:
模板实在网上下载的http://demo.cssmoban.com/cssthemes4/cttp_16_x_lbd/dashboard.html
注意
资源文件Html/CSS/Image/JS 都可以添加到qrc中,这样会被直接编译到exe中
改天整理一份Android 端基于X5浏览器内核 的C++与Html 通信;