如何让PyQt5中QWebEngineView与JavaScript交互


Posted in Python onOctober 21, 2020

准备工作

开发环境

  • Python 3.8.1
  • Windows 10

安装依赖

pip install PyQt5
pip install PyQtWebEngine

Python端

1.使用QWebChannel的registerObject("JsBridge名","JsBridge")方法注册回调

  • JsBridge名:在JavaScript中调用时使用的对象名称
  • JsBridge:被JavaScript调用的Python对象

2.JsBridge 对象

  • 入参
@QtCore.pyqtSlot(str)
def log(self, message):
  print(message)
  • 出参
@QtCore.pyqtSlot(result=str)
def getName(self):
  return "hello"
  • 出入参
@QtCore.pyqtSlot(str, result=str)
def test(self, message):
  print(message)
  return "ok"

JavaScript端

在Html的<head>中添加

<script src='qrc:///qtwebchannel/qwebchannel.js'></script>

调用

new QWebChannel(qt.webChannelTransport, function(channel) {
   channel.objects.pythonBridge.test("hello",function(arg) {
     console.log("Python message: " + arg);
     alert(arg);
   });
 });

调试(Chrome DevTools)

  1. 配置环境变量:QTWEBENGINE_REMOTE_DEBUGGING = port
  2. 使用Chromium内核的浏览器打开地址:http://127.0.0.1:port
  3. 使用PyCharm中可以在运行配置(Run/Debug Configurations)中的Environment variables中添加环境变量,用;号分隔,然后可以直接运行。

Demo

Python

1.JsBridge

from PyQt5 import QtCore

class JsBridge(QtCore.QObject):
  @QtCore.pyqtSlot(str, result=str)
  def test(self, message):
    print(message)
    return "ok"

2.Application

from PyQt5 import QtCore
from PyQt5 import QtWebEngineWidgets
from PyQt5.QtCore import QDir
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import *

class TestWindow(QMainWindow):
  def __init__(self):
    super().__init__()
    self.webView = QWebEngineView()
    self.webView.settings().setAttribute(
      QtWebEngineWidgets.QWebEngineSettings.JavascriptEnabled, True)

    channel = QWebChannel(self.webView.page())
    self.webView.page().setWebChannel(channel)
    self.python_bridge = JsBridge(None)
    channel.registerObject("pythonBridge", self.python_bridge)
    layout = QVBoxLayout()
    layout.addWidget(self.webView)
    widget = QWidget()
    widget.setLayout(layout)
    self.setCentralWidget(widget)

    self.resize(900, 600)
    self.setWindowTitle('Test')
    qr = self.frameGeometry()
    cp = QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    self.move(qr.topLeft())
    self.show()
    html_path = QtCore.QUrl.fromLocalFile(QDir.currentPath() + "/assets/index.html")
    self.webView.load(html_path)

if __name__ == '__main__':
  app = QApplication(sys.argv)
  m = TestWindow()
  sys.exit(app.exec_())

JavaScript

index.html

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>Test</title>
  <script src='qrc:///qtwebchannel/qwebchannel.js'></script>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"
      integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
      crossorigin="anonymous"></script>
</head>
<body>
  <button id="test">test</button>
</body>
<script>
  $(document).ready(function() {
    new QWebChannel(qt.webChannelTransport, function(channel) {
      $('#test').on('click', function() {
        channel.objects.pythonBridge.test("hello",function(arg) {
         console.log("Python message: " + arg);
         alert(arg);
        });
      });
    });
  });
</script>
</html>

本文作者: liaoheng
本文链接: https://liaoheng.me/2019/12/23/PyQt5-QWebEngineView与JavaScript交互/

以上就是如何让PyQt5中QWebEngineView与JavaScript交互的详细内容,更多关于QWebEngineView与JavaScript交互的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
python绘制散点图并标记序号的方法
Dec 11 Python
Python数据可视化之画图
Jan 15 Python
用Python识别人脸,人种等各种信息
Jul 15 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
对python中return与yield的区别详解
Mar 12 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
python 3.8.3 安装配置图文教程
May 21 Python
Python为何不支持switch语句原理详解
Oct 21 #Python
基于Python爬取素材网站音频文件
Oct 21 #Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 #Python
运行Python编写的程序方法实例
Oct 21 #Python
Python读写csv文件流程及异常解决
Oct 20 #Python
Python脚本打包成可执行文件过程解析
Oct 20 #Python
PyQt5的QWebEngineView使用示例
Oct 20 #Python
You might like
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python将图片转换为字符画的方法
2020/06/16 Python
Python检测网络延迟的代码
2018/05/15 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
详解Python中is和==的区别
2019/03/21 Python
python中eval与int的区别浅析
2019/08/11 Python
python 列表推导式使用详解
2019/08/29 Python
wxpython绘制圆角窗体
2019/11/18 Python
flask项目集成swagger的方法
2020/12/09 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
中式餐厅创业计划书范文
2014/01/23 职场文书
语文教育专业求职信
2014/06/28 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
Python类方法总结讲解
2021/07/26 Python
Python使用永中文档转换服务
2022/05/06 Python