针对QT与JavaScript交互时用runJavaScript调用函数却显示函数未定义的解决方法

博主在完成大作业过程中遇到JavaScript与QT交互的难题,经过排查发现是JavaScript代码位置不当导致的问题。将JS函数放在<head>标签内而非<body>之间后,成功调用了JavaScript的函数。博客内容涉及QT WebEngineView、QWebChannel和JavaScript的交互,以及百度地图API的使用。
摘要由CSDN通过智能技术生成

最近一段时间在弄一个大作业,要调用地图的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>

最后唠嗑一句,如果还有其他的解决方法也欢迎补充。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值