如何让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记录详细调用堆栈日志的方法
May 05 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
Python subprocess模块详细解读
Jan 29 Python
python模块导入的细节详解
Dec 10 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python变量访问权限控制详解
Jun 29 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
python 实现矩阵按对角线打印
Nov 29 Python
Python Lambda函数使用总结详解
Dec 11 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正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
Python的函数的一些高阶特性
2015/04/27 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python3多线程知识点总结
2019/09/26 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
物业公司采购员岗位职责
2013/12/31 职场文书
上班迟到检讨书
2014/01/10 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
2014年大学班长工作总结
2014/11/14 职场文书