在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>
您可以使用 PyQt5/PySide2 提供的 QWebEngineView 类来显示 Web 内容,并在其上方添加菜单栏。以下是一个简单的示例代码: ```python from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtWebEngineWidgets import * class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QWebEngineView 对象并添加到窗口中 self.webview = QWebEngineView() self.setCentralWidget(self.webview) # 创建菜单栏 menubar = self.menuBar() # 添加“文件”菜单 file_menu = menubar.addMenu("文件") # 添加“打开”菜单项 open_action = QAction("打开", self) open_action.triggered.connect(self.open_file) file_menu.addAction(open_action) def open_file(self): # 打开文件对话框并获取选择的文件路径 filename, _ = QFileDialog.getOpenFileName(self, "打开文件", "", "HTML 文件 (*.html *.htm)") if filename: # 加载文件内容到 QWebEngineView 中 self.webview.load(QUrl.fromLocalFile(filename)) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个例子中,我们创建了一个 MainWindow 类,它继承自 QMainWindow 类。在 MainWindow 的构造函数中,我们创建了一个 QWebEngineView 对象,并将其设置为 MainWindow 的中央窗口部件。我们还创建了一个菜单栏并添加了一个“文件”菜单,其中包含一个“打开”菜单项。该菜单项绑定了 open_file() 方法,该方法通过文件对话框打开一个 HTML 文件,并将其内容加载到 QWebEngineView 中。 您可以根据您的需要添加更多的菜单项和操作。希望这能帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值