最近一段时间在弄一个大作业,要调用地图的api,导致要JavaScript与QT交互,因为不能与JavaScript就拖了很久,今天晚上又找了很久,终于是哪里的问题了。
开始以为是QT里写的有问题,但其实没问题,函数如下:
user.h
#ifndef USER_H
#define USER_H
#include <QWidget>
#include <QWebEngineProfile>
#include <QWebEngineView>
#include <QWebChannel>
#include <QJSEngine>
#include <QMainWindow>
namespace Ui {
class user;
}
class user : public QMainWindow
{
Q_OBJECT
public:
explicit user(QWidget *parent = nullptr);
~user();
QWebEngineView *webview = nullptr;
QWebChannel *channel = nullptr;
void test();
private:
Ui::user *ui;
};
user.cpp
#include "user.h"
#include "ui_user.h"
#include<QVBoxLayout>
user::user(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::user)
{
ui->setupUi(this);
webview = new QWebEngineView(this);
channel = new QWebChannel(this);
channel->registerObject(QString("webobj"), this); // QWebChannel对Widget类,注册一个webobj的通信介质 / webobj需要和js内的保持一致
webview->page()->setWebChannel(channel);
webview->setUrl(QUrl("file:///D:/QTcode/gis/lineshow.html"));
webview->resize(400,400);
webview->show();
connect(webview, &QWebEngineView::loadFinished, this, &user::test);
}
user::~user()
{
delete ui;
}
void user::test(){
webview->page()->runJavaScript(QString("a(%1,%2,%3,%4)").arg("106.233").arg("29.6123").arg("106.293").arg("29.6073")); //这个是调用js中的function
}
其实是HTML里JavaScript部分代码的问题,这里是已经改好的代码,不过百度地图的ak被删掉了,如果要使用的,取申请一个填进去就行了。问题:如果要调用JavaScript的函数,JavaScript的函数要在head-head之间才能被调用,在body之间我不知道为什么不行,我JavaScript也是这段时间做大作业才开始接触,不知道原理浪费了我好多天时间,如果还要更新等得我熬过期末这段时间了。
<!DOCTYPE html>
<html>
<head>
<script src="qwebchannel.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=3.0&ak="></script>
<style type="text/css">
html,body{
width:100%;
height:100%;
margin:0;
overflow:hidden;
font-family:"微软雅黑";
}
</style>
<div style="width:100%;height:100%;border:1px solid gray" id="map"></div>
<script type="text/javascript">
// 百度地图API功能
var map = new BMap.Map("map");
map.centerAndZoom("重庆", 12);
map.enableScrollWheelZoom();
new QWebChannel(qt.webChannelTransport,
function(channel){
bridge= channel.objects.person;
function mar(x,y){//标记点
var marke=new BMap.Marker(new BMap.Point(106.33,29.35));
map.addOverlay(marke);
}
function sou(x1,y1,x2,y2){
var point1=new BMap.Point(x1,y1),
point2=new BMap.Point(x2,y2);
var points = [point1,point2];
show(points);
}
function a(x1,y1,x2,y2){
alert("x1,y1,x2,y2");
}
});
function mar(x,y){//标记点
var marke=new BMap.Marker(new BMap.Point(106.33,29.35));
map.addOverlay(marke);
}
function sou(x1,y1,x2,y2){//把两个点连线
var point1=new BMap.Point(x1,y1),
point2=new BMap.Point(x2,y2);
var points = [point1,point2];
show(points);
}
function a(x1,y1,x2,y2){
sou(x1,y1,x2,y2);
}
function show(points){
var curve = new BMap.Polyline(points, {strokeColor:"#00b3ff",strokeWeight:2, strokeOpacity:1}); //创建直线对象
map.addOverlay(curve);}//添加到地图中
</script>
</head>
<body>
</body>
</html>
最后唠嗑一句,如果还有其他的解决方法也欢迎补充。