如何让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 03 Python
Python实现抢购IPhone手机
Feb 07 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
python os.path模块常用方法实例详解
Sep 16 Python
python3使用matplotlib绘制散点图
Mar 19 Python
python中使用while循环的实例
Aug 05 Python
wxPython实现文本框基础组件
Nov 18 Python
python turtle 绘制太极图的实例
Dec 18 Python
python批量处理txt文件的实例代码
Jan 13 Python
python之生成多层json结构的实现
Feb 27 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
php一些公用函数的集合
2008/03/27 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python 内置函数complex详解
2016/10/23 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
详解python的super()的作用和原理
2020/10/29 Python
python基于openpyxl生成excel文件
2020/12/23 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
大学生应聘推荐信范文
2013/11/19 职场文书
健康教育评估方案
2014/05/25 职场文书
法人代表任命书范本
2014/06/05 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
生日赠语
2015/06/23 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS