如何让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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python实现调度算法代码详解
Dec 01 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
python解压zip包中文乱码解决方法
Nov 27 Python
Python截图并保存的具体实例
Jan 14 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 Python
python playwright 自动等待和断言详解
Nov 27 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
php 常用类汇总 推荐收藏
2010/05/13 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP加密解密类实例代码
2016/07/20 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
解决uWSGI的编码问题详解
2017/03/24 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python-opencv颜色提取分割方法
2018/12/08 Python
python实现弹窗祝福效果
2019/04/07 Python
python各类经纬度转换的实例代码
2019/08/08 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
南京某软件公司的.net面试题
2015/11/30 面试题
最新会计专业求职信范文
2014/01/28 职场文书
住宅质量保证书
2014/04/29 职场文书
中秋节活动总结
2014/08/29 职场文书
大学新生入学感想
2015/08/07 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫