如何让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之list和str比较
Sep 20 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
Python自动生产表情包
Mar 17 Python
python爬虫获取新浪新闻教学
Dec 23 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
Python实现仓库管理系统
May 30 Python
LeetCode189轮转数组python示例
Aug 05 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
8个必备的PHP功能实例代码
2013/10/27 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
Python单链表的简单实现方法
2014/09/23 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
对Python 内建函数和保留字详解
2018/10/15 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
车祸赔偿收入证明
2014/01/09 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
校本培训个人总结
2015/02/28 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫