python - PyQt QtWebChannel : calling Python function from JavaScript

标签 python pyqt pyqt5 qwebengineview qtwebchannel

我正在尝试,使用 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_()

问题似乎是变量 backendQWebChannel 之外不可见构造函数。我试着做 backend widnow 的属性使其成为全局,但它没有用。

最佳答案

问题不是可见性而是与点击事件的连接,文件的上传是从上到下所以你试图在标题还不存在的时候连接,解决办法是重写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>

关于python - PyQt QtWebChannel : calling Python function from JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49416790/

相关文章:

python - 需要用 PyQt4 实例化 QWidget

python - 为什么不能在元组对象上调用函数?

python - 即使在关闭 pyqt 应用程序后网络摄像头实例也不会被释放

python - 如何使用 QComboBox.setPlaceholderText?

python doctest : expected result is the same as the "got" result but the test failed

python - __abstractmethods__ 和 AttributeError

python - 直接上传到本地谷歌云存储

python - 与 xgboost.cv 相比,GridSearchCV 未给出与预期相同的结果

python - 使用 PyQt 实现分割器(QtCreator 生成的文件)

python - PyQt Tableview 行背景颜色基于单元格值