Qt WebView js交互(new) 支持ios android 平台
扫描二维码
随时随地手机看文章
由于服务器和HTML界面在同一个进程,因此传输速度很快,不用考虑传输速度问题。
并且C++端放在本地可以做本地App应用,放在服务器,可以做网页应用。
原理是 界面中 new Qt HTTP服务器,
HTML端用JavaScript XMLHttpRequest发送请求给C++(可包含参数 参数中使用字符串用来表示,函数可以用HTTP 子域开表示,),C++根据传入的字符串,调用Qt元函数,或者封装入Qt quick中,调用eval.推荐用Qt quick封装,因为更方便,他里面封装好了ios 和 android的Webview
返回值由C++ HTTP服务器端返回。
因为直接是Qt和javasc交互,因此跳过了中间层
传统:
C++ —> JAVA(objecttive C) —> JavaScript
C++ <— JAVA(objecttive C) <—- JavaScript
现在:C++
DEMO:
int testdata=0; void Helloworldcontroller3::service(HttpRequest &request, HttpResponse &response) { //允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); QByteArray path=request.getPath(); qDebug("RequestMapper: path=%s",path.data()); if (path=="/test") { //获取参数 QByteArray m_id=request.getParameter("p1"); QString s; s.sprintf("data %d",m_id.toInt()); response.setStatus(200,"ok"); //返回成功代码200 已经代码字符串 response.write(s.toStdString().c_str(),true);//写入参数 testdata++; } else { response.setStatus(404,"oo!Not found"); QString s =QString::fromLocal8Bit("未知的连接哦"); QByteArray s2(s.toStdString().c_str()); response.write(s2,true); } qDebug("RequestMapper: finished request"); }
var xhr; function 异步CALL_Test(arg1) { if (!xhr) { xhr = new XMLHttpRequest(); } if (xhr) { //写入参数 xhr.open('POST', "http://localhost:8080/test?p1="+arg1, true);//异步调用 发送给Qt端 xhr.onreadystatechange = function(evtXHR){ if (xhr.readyState == 4) { if (xhr.status == 200) {//如果发送成功 var response = xhr.responseText;//获取Qt返回值 作为新建列表的标题 alert(response) $("#list1").append('Inbox'+response+''); $("#list1").listview("refresh"); } else { alert( "不允许跨域请求。" + xhr.status+xhr.responseText); } } }; xhr.send(null); } else { alert("Sorry!程序出错!Code Postion:XML ERROR:1") } // alert("end"); } $(function(){ $("button").click(function(){ 异步CALL_Test(123); }); });