Ich erstellte eine Brücke QObject, Der Fehler, den ich bei der Implementierung dieser Klasse lief, war, dass ich vergaß, @QtCore.pyqtSlot
Dekorateur hinzuzufügen, und es war wichtig.
class Bridge(QtCore.QObject):
@QtCore.pyqtSlot()
def some_slot():
print("Slot Invoked")
Hier habe ich ein QWebEngineView
und ein QWebChannel
und stellen Sie den Web-Kanal der QWebEnginePage
diesen Kanal und umgekehrt zu sein.
Dann habe ich meine Brücke QObject self.helper_bridge
ich zunächst gar nicht self
verwenden und verwendet nur helper_bridge
durch seine eigene, und natürlich das machte meine app Absturz
class MainWidget(object):
def __init__(self):
...
self.webView = QtWebEngineWidgets.QWebEngineView(parent)
channel = QtWebChannel.QWebChannel(self.webView.page())
self.webView.page().setWebChannel(channel)
self.helper_bridge = Bridge()
channel.registerObject("helperBridge", self.helper_bridge)
url = QtCore.QUrl("file:///path/to/index.html")
self.webView().page().load(url)
...
Endlich die index.html
Seite,
Beachten Sie das zweite Skript, das von Qt zur Verfügung gestellt wird.
Hier habe ich eine Instanz von QWebChannel
bei meinem Transport erstellt: qt.webChannelTransport
, und innerhalb des Callbacks behandelt ich die Klickereignisbindung, wie Sie sehen können.
<html>
<head>
</head>
<body>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js'</script>
<script src='qrc:///qtwebchannel/qwebchannel.js'></script>
<h1>hello</h1>
<ul>
<li>list item 1</li>
<li>list item 2</li>
</ul>
<a href='#go'>GO</a>
<script>
$(document).ready(function(){
new QWebChannel(qt.webChannelTransport, function(channel){
$('h1').on('click', function({
channel.objects.helperBridge.some_slot()
});
});
});
</script>
</body>
Referenzen: