pyqt5与本地html进行js交互
最近用pyqt5封装个项目。
html与python之间交互是必不可少的。
根据度娘资料,写个例子!
在PyQt5.9中, 应用QWebEngineView和QWebChannel技术, 可以进行HTML与本地代码进行交互.
要点:
- 创建交互对象, 基于QObject, 定义信息槽
- 创建QWebChannel, 在channel中注册交互对象
- 设置页面WebChannel
- 定义网页
- 在网页中包含qwebchannel.js 在DomReady时, 创建js QWebChannel, 连接到本地对象
实例:
一. 创建Html文件
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="qwebchannel.js"></script>
<title>QWebChannel测试</title>
<script>
window.onload = function () {
new QWebChannel(qt.webChannelTransport, function (channel) {
window.pyjs = channel.objects.pyjs;
pyjs.myHello(alert);
});
}
</script>
</head>
<body>
<div id="test">
this is test !
</div>
<div onclick="qt5test();">测试</div>
<script>
function qt5test() {
pyjs.myTest('这是测试传参的',function (res) {
alert(res);
});
}
function uptext(msg) {
document.getElementById('test').innerHTML=msg;
}
</script>
</body>
</html>
qwebchannel.js源代码二. 创建Python代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QObject, pyqtSlot, QUrl
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView
class CallHandler(QObject):
@pyqtSlot(result = str)
def myHello(self):
view.page().runJavaScript('uptext("hello, Python");')
print('call received')
return 'hello, Python'
@pyqtSlot(str,result=str)
def myTest(self,test):
return test
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QWebEngineView()
channel = QWebChannel()
handler = CallHandler()
channel.registerObject('pyjs', handler)
view.page().setWebChannel(channel)
url_string = "file:///D:/testPyQt5/html/index.html"
view.load(QUrl(url_string))
view.show()
sys.exit(app.exec_())
注意:
- url_string = "file:///D:/testPyQt5/html/index.html"这一句要换成自己的文件,
- qwebchannel.js 要从http://doc.qt.io/qt-5/qtwebengine-webenginewidgets-markdowneditor-resources-qwebchannel-js.html里拷贝
- qwebchannel.js 与 test.html 文件放在同一个目录
qt5接收js传递的参数:
pyqt中信号与槽的参数传递。
当信号与槽函数的参数数量相同时,它们参数类型要完全一致。
信号与槽不能有缺省参数。
当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。
此外,在不进行参数传递时,信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个无参数的槽函数。
可以出传递的参数类型有很多种:str、int、list、object、float、tuple、dict等等
https://blog.csdn.net/huhuliuxia/article/details/50478294