如何让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实现爬取千万淘宝商品的方法
Jun 30 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
Python堆排序原理与实现方法详解
May 11 Python
利用Django模版生成树状结构实例代码
May 19 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python插件机制实现详解
May 04 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
如何验证python安装成功
Jul 06 Python
python中np是做什么的
Jul 21 Python
Python如何定义有默认参数的函数
Aug 10 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 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中定义网站根目录的常用方法
2010/08/08 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
javascript event 事件解析
2011/01/31 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
利用Python如何生成随机密码
2016/04/20 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python地震数据可视化详解
2019/06/18 Python
Python列表操作方法详解
2020/02/09 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
java程序员面试交流
2012/11/29 面试题
网上商城创业计划书范文
2014/01/31 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
《开国大典》教学反思
2014/04/19 职场文书
活动总结怎么写
2014/04/28 职场文书
升国旗演讲稿
2014/09/05 职场文书
发票退票证明
2015/06/24 职场文书
运动会广播稿50字
2015/08/19 职场文书
golang 语言中错误处理机制
2021/08/30 Golang