欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT与JS获取QT数据

程序员文章站 2024-03-16 18:42:10
...

本文是QT5.13里的结果。

QWebEngineview里打开网页之后,实现QT程序和H5,JS的通信,以方便实现一些功能。

采用的是QWebChannel来实现他们的交互的

QWebChannel *channel = new QWebChannel(this);
channel->registerObject("test", new WebObject());
//这个是为加载网页失败的时候不显示错误页面
m_ui.webEngineView->page()->profile()->settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false);

m_ui.webEngineView->page()->profile()->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
	
m_ui.webEngineView->page()->setWebChannel(channel);

WebOjbect类为
class WebObject :public QObject
{
	Q_OBJECT
public:
	WebObject();
	~WebObject();

	Q_INVOKABLE  void WebWriteLog(QString str);
	Q_INVOKABLE  void OpenUrl(QString url);
	Q_INVOKABLE  QString GetUserData();
	Q_PROPERTY(QString UserData READ GetUserData)
};
//
//WebWriteLog 这个函数是可以直接在JS里调用的函数
//UserData 可以在JS里直接read,因为没写WRITE,所以在JS假如对其进行赋值则会出错,
//这个在编译启动的时候,会有一些提示。
//要去掉这些提示则可以添加WRITE,并写一个USERDATACHANGE对应的槽就好了
一个测试的HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta charset="utf-8">
	<title>test</title>
</head>
<body style="background:#282c34;">
<script src="qwebchannel.js"></script>
<h3 style="color:#ffffff;">我就是测试下</h3>
<input type="button" value="callback" onclick="onCallback()">
<input type="button" value="callback2" onclick="onCallback2()">
<script type="text/javascript">
  new QWebChannel(qt.webChannelTransport, function(channel) {
	window.test = channel.objects.test;
  })
  function onCallback() {
	if (test) {
	  test.WebWriteLog()
	}
  }
  function onCallback2() {
	if (test) {
	  test.OpenUrl("abcdddf",function(returnValue){alert(returnValue)})
      data = test.UserData //这个是直接获取UserData值
	}
  }
function web_login(data){
	alert(data.toString())
}
function web_logout(){
	alert("log out")
}
</script>
</body> 
</html> 

备注:qwebchannel.js在QT安装目录里搜一搜就好了,复制过来就行

QT调用JS则相对比较简单了
char szTmp[1024] = { 0 };
sprintf(szTmp, "web_login({\"userid\":11111,\"token\":\"aaaaa\"}));
m_ui.webEngineView->page()->runJavaScript(szTmp);
这样就会调用web_login 并传入之后的字符串为参数。当然web_login在JS里要有,不然会出错。

 

相关标签: 笔记