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)
我在文档中找不到必须找到可能的修复方法
您必须使用 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\nRun Code Online (Sandbox Code Playgroud)\n\n主要.py
\n\nimport 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_())\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n