PySide2 和支持 addToJavaScriptWindowObject

Spa*_*Boy 3 python python-3.x pyside2 qwebengineview qtwebchannel

我正在尝试将 PySide 应用程序版本 #1 移植到 PySide2,并努力寻找移植以下代码片段的解决方案:

class AppManager(QtCore.QObject):
    '''
    methods of AppObject will be available from javascript
    '''
    def __init__(self, webview):
        QtCore.QObject.__init__(self)


class WebView(QWebEngineView):
    def __init__(self, parent=None):
        QWebEngineView.__init__(self, parent)
        self.setPage(WebEnginePage(self))

    def contextMenuEvent(self, event):
        pass


class AppWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.view = WebView(self)
        self.page = self.view.page()
        self.app_manager = AppManager(self.view)
        self.page.mainFrame().addToJavaScriptWindowObject('app_manager', self.app_manager)
        # ERROR in above line !!!
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到必须找到可能的修复方法

eyl*_*esc 5

您必须使用 QWebChannel,为此您必须下载qwebchannel.js(链接指向Qt 5.12的qwebchannel.js,对于不同版本更改 github 分支)。

\n\n

在下面的代码中我展示了一个示例:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 qwebchannel.js\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要.py

\n\n
import sys\n\nfrom PySide2 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets, QtWebChannel\n\n\nclass WebEnginePage(QtWebEngineWidgets.QWebEnginePage):\n    pass\n\nclass AppManager(QtCore.QObject):\n    textChanged = QtCore.Signal(str)\n    def __init__(self, webview):\n        QtCore.QObject.__init__(self)\n        self.m_text = ""\n\n        timer = QtCore.QTimer(self)\n        timer.timeout.connect(self.on_timeout)\n        timer.start(1000)\n\n    def on_timeout(self):\n        self.text  = QtCore.QDateTime.currentDateTime().toString()\n\n    @QtCore.Property(str, notify=textChanged)\n    def text(self):\n        return self.m_text\n\n    @text.setter\n    def setText(self, text):\n        if self.m_text == text:\n            return\n        self.m_text = text\n        self.textChanged.emit(self.m_text)\n\n\nclass WebView(QtWebEngineWidgets.QWebEngineView):\n    def __init__(self, parent=None):\n        QtWebEngineWidgets.QWebEngineView.__init__(self, parent)\n        self.setPage(WebEnginePage(self))\n\n    def contextMenuEvent(self, event):\n        pass\n\n\nclass AppWindow(QtWidgets.QMainWindow):\n    def __init__(self):\n        QtWidgets.QMainWindow.__init__(self)\n        self.view = WebView(self)\n        self.page = self.view.page()\n        self.app_manager = AppManager(self.view)\n        channel = QtWebChannel.QWebChannel(self)\n        self.page.setWebChannel(channel)\n        channel.registerObject("app_manager", self.app_manager)\n        self.view.load(QtCore.QUrl.fromLocalFile(QtCore.QDir.current().filePath("index.html")))\n        self.setCentralWidget(self.view)\n\nif __name__ == \'__main__\':\n    app = QtWidgets.QApplication(sys.argv)\n    w = AppWindow()\n    w.show()\n    sys.exit(app.exec_())\n
Run Code Online (Sandbox Code Playgroud)\n\n

索引.html

\n\n
<html>\n<head>\n    <script type="text/javascript" src="./qwebchannel.js"></script>\n</head>\n<header><title>This is title</title></header>\n<body>\n\n<p id="output"></p>\n\n<script type="text/javascript">\n    window.onload = function() {\n        new QWebChannel(qt.webChannelTransport, function (channel) {\n            window.app_manager = channel.objects.app_manager;\n            console.log(app_manager);\n\n            app_manager.textChanged.connect(function(message) {\n                document.getElementById("output").innerHTML = "Received message: " + message;\n            });\n\n        });\n    }\n</script> \n</body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n

  • 在这种情况下,使用建议的 qwebchannel.js 文件对于软件创建者来说是免费的吗?或者他们应该订购付费版本的 PyQT? (3认同)