在pyside的QWebEngineView中和javascript通信

在pyside2中可以使用QtWebChannel 使QWebEngineView和前端页面的javasccript通信

代码:

from PySide2.QtWebChannel import QWebChannel
from PySide2.QtCore import QUrl, Signal, Slot, QObject
from PySide2.QtWebEngineWidgets import QWebEngineProfile, QWebEnginePage, QWebEngineSettings,QWebEngineView
#创建一个桥
class Bridge(QObject):
    #信号槽函数 接收javascript发送的消息
    @Slot(str)
    def js_message(self, text):
        # 这里可以处理从 JavaScript 接收到的选择内容
        print(text)
    # Python反馈消息给JavaScript  
    @Slot(str, result=str)  
    def python_message(self, text):  
        # 处理消息,并返回结果  
        result = f"Python收到: {text}, 回复: 你好!"  
        return result 

#自定义一个QWebEngineView类
class MyWebEngineView(QWebEngineView):
    def __init__(self, parent=None):
        super(MyWebEngineView, self).__init__(parent)


        page = QWebEnginePage()
        self.setPage(page)
        #创建QWebChannel
        self.channel = QWebChannel()
        self.bridge = Bridge()
        #将bridge注册到QWebChannel
        self.channel.registerObject('bridge', self.bridge)
        self.page().setWebChannel(self.channel)

    #重写setHtml 对加载的页面增加qwebchannel.js的调用和 上面bridge对象的调用
    def setHtml(self, html_content):
        modified_html = html_content+"""
            <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
            <script>
                var bridge;
               new QWebChannel(qt.webChannelTransport, function (channel) {
                   bridge = channel.objects.bridge;
               });
               var message= '发送给python程序'
                bridge.js_message(html);
            </script>   
            """
        super(MyWebEngineView, self).setHtml(modified_html)
上面示例介绍了前端页面加载的时候,发送给pyside信息.

如果是接收python发送来的消息,如下面实现:
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>  
<script>  
    var bridge;  
    new QWebChannel(qt.webChannelTransport, function (channel) {  
        bridge = channel.objects.bridge;  
  
        // 调用Python方法  
        bridge.python_message('Hello from JavaScript').then(function(result) {  
            console.log(result);  // 输出Python的回复  
        });  
        
    });  
</script>

相关文章

代码示例:Python 调用并执行 JS

经常做爬虫需要扣JS的老铁一定很熟悉这段操作,通过execjs调用并执行 JS 对一些加解密的处理非常有用。在此记录一下相互学习交流。以下是具体步骤:1、安装 execjspip install py...

如何使用 Scrapy 执行 JavaScript

大多数现代网站都使用客户端 JavaScript 框架,例如 React、Vue 或 Angular。在没有服务器端渲染的情况下从动态网站抓取数据通常需要执行 JavaScript 代码。我已经抓取了...

Python爬虫高级之JS渗透登录新浪微博 | 知了独家研究

小伙伴们看到标题可能会想,我能直接自己登陆把登陆后的cookie复制下来加到自定义的请求头里面不香嘛,为什么非要用python模拟登录的过程?如果我们是长期爬取数据,比如每天早上中午和晚上定时爬取新浪...

Python、JavaScript和Rust的Web性能比较

Python使用FastApi测试;Node.JS使用Fastify;Rust则使用Actix。选择的Python和Node框架,是在搜索 "最快的<某语言>api "时得...

网页数据如何获取,带你走近JS逆向,完全入门级!

在这个大数据时代,我们眼睛所看到的百分之九十的数据都是通过页面呈现出现的,不论是PC端、网页端还是移动端,数据渲染还是基于html/h5+javascript进行的,而大多数的数据都是通过请求后台接口...