目的:实现安卓手机上调用百度地图api实现标记画轨迹等操作
环境:qt 5.14.2 配置了android环境
代码实现:
qt 5.几后web使用的是WebEngine 好像只支持msvc,如果开发android目前想到的方法就是用qml了,qml与widget嵌套。ui界面嵌套 quickWidget ,quickWidget在设置qml文件,即可实现了。
QUrl url("qrc:/main2.qml");
ui->quickWidget->setSource(url);
除qml其他与桌面版本开发没有啥区别。
qml文件,安卓目录为assets下
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtWebView 1.1
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.2
import QtQuick.Window 2.0
import QtWebSockets 1.1
Rectangle {
id : root;
width: parent.width
height: parent.height
signal loadUrl(string url)
WebView {
id: webView
width: parent.width
height: parent.height
anchors.fill: parent
url: "file:///android_asset/web/map.html"
}
function onLoadUrl(str){
//webView.url=str;
//webView.reload();//var points2 = "121.317,31.417|121.517,31.417|121.617,31.517";
//addPolygon(points2);
webView.runJavaScript(str,function(result) {
console.log(result); })
//webView.reload();
}
Component.onCompleted: {
// employer 信号 连接 多个槽函数或信号
root.loadUrl.connect(onLoadUrl)
// webView.runJavaScript("getValue()",function(result) { console.log(result); })
}
}
记录几个踩过的坑,
1.qml文件中不能使用 ApplicationWindow,不能嵌入到quickWidget中,会自动全屏或者按照你设置的尺寸显示。
2.android目录没搞清,可以百度搜一下
3.与web的js交互:这个困扰了2天,开始搜了一下,说是可以用websocket,网上找的例子桌面版的可以实现,结果到了android就不行,排查了一天,开始以为js文件没有引用成功,结果发现webview不支持websocket问题,又学习怎么解决webview不支持websocket问题,结果已失败告终。网上又说解决的链接,没学明白
以下代码是链接websockert的,服务器创建与链接交互,qt有例子 资料
// 连接c++端的 Websocket
var socket = new WebSocket('ws://192.168.43.1:9009');
//var socket = new WebSocket('ws://127.0.0.1:9009');
// 连接成功后
socket.onopen = function(){
//alert("onopen");
// 创建Webchannel
new QWebChannel(socket, function (channel) {
// 获取类的对象
webObj = channel.objects.mytestclass;
alert("status");
// 类的事件
webObj.navStatusChanged.connect(function(arg){
//salert("navStatusChanged: " + arg);
eval(arg);
});
});
}
c++代码
// 要导出的类,此类供js调用
m_myTestClass = new MyTestClass(this);
// 创建QWebChannel,把创建的类注册到QWebChannel中,js才能调用此类的方法
m_webChannel = new QWebChannel(this);
m_webChannel->registerObject("mytestclass", m_myTestClass);
/*
// js与C++通信方式一、使用QWebEngineView加载网页,web端js与C+