PyQt QtWebChannel:从JavaScript调用Python函数

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

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
分享改善这个问题
3月21日22:03编辑

eyllanesc
56.1k72348
3月21日21:26 问

MrLoon
13五
添加评论
1答案
活跃的 最老 票
投票
0
投票
接受
问题不在于可见性,而是与click事件的连接,文件的上传是从上到下,所以当它不存在时,你试图连接头,解决方案是重写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>

猜你喜欢

转载自blog.csdn.net/ieeso/article/details/82346112