【问题标题】:PyQt QtWebChannel: calling Python function from JavaScriptPyQt QtWebChannel:从 JavaScript 调用 Python 函数
【发布时间】:2018-08-31 04:33:57
【问题描述】:

我正在尝试使用 Qt 类 QWebEngineViewQWebChannel 在 HTML 页面和 Python 脚本之间建立简单的连接。目标只是在单击标题<h2> 时执行foo()

import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage

html = '''
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>        
    <script src="qrc:///qtwebchannel/qwebchannel.js"></script>
    <script>
    var backend;
    new QWebChannel(qt.webChannelTransport, function (channel) {
        backend = channel.objects.backend;
    });

    document.getElementById("header").addEventListener("click", function(){
        backend.foo();
    });
    </script>
</head>
<body> <h2 id="header">Header.</h2> </body>
</html>
'''

class HelloWorldHtmlApp(QWebEngineView):

    def __init__(self):
        super().__init__()

        # setup a page with my html
        my_page = QWebEnginePage(self)
        my_page.setHtml(html)
        self.setPage(my_page)

        # setup channel
        self.channel = QWebChannel()
        self.channel.registerObject('backend', self)
        self.page().setWebChannel(self.channel)
        self.show()

    @pyqtSlot()
    def foo(self):
        print('bar')


if __name__ == "__main__":
    app = QApplication.instance() or QApplication(sys.argv)
    view = HelloWorldHtmlApp()
    view.show()
    app.exec_()

问题似乎是backend 变量在QWebChannel 构造函数之外不可见。我试图将backend 设为widnow 的属性以使其全局,但它不起作用。

【问题讨论】:

    标签: python pyqt pyqt5 qwebengineview qtwebchannel


    【解决方案1】:

    问题不在于可见性,而是与点击事件的连接,文件的上传是从上到下的,因此您在标题尚不存在时尝试连接标题,解决方案是重写HTML:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>        
            <script src="qrc:///qtwebchannel/qwebchannel.js"></script>
        </head>
        <body> <h2 id="header">Header.</h2> </body>
        <script>
            var backend;
            new QWebChannel(qt.webChannelTransport, function (channel) {
                backend = channel.objects.backend;
            });
    
            document.getElementById("header").addEventListener("click", function(){
                backend.foo();
            });
        </script>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2020-07-31
      • 1970-01-01
      • 2018-02-22
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多