如何让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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
python中字符串类型json操作的注意事项
May 02 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
python excel转换csv代码实例
Aug 26 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
解决Python使用列表副本的问题
Dec 19 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 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小技巧之函数重载
2014/06/02 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP错误机制知识汇总
2016/03/24 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
javascript实用方法总结
2015/02/06 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
python的Template使用指南
2014/09/11 Python
用Python编写简单的微博爬虫
2016/03/04 Python
Python for循环与getitem的关系详解
2020/01/02 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
幼儿园小班教学反思
2014/02/02 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
创新社会管理心得体会
2014/09/12 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
骨干教师考核评语
2014/12/31 职场文书
工程部岗位职责
2015/02/10 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python