在PyQt5和PyQt6中,QWebEnginePage
类已经不再包含javaScriptWindowObjectCleared
信号,因此在调用该信号时会出现AttributeError
错误。
如果你需要在WebView中注入JavaScript对象,可以使用QWebChannel
类来实现。QWebChannel
类可以将Python对象注册到WebView中,并在JavaScript中使用这些对象。
以下是一个示例代码,演示如何在PyQt6中使用QWebChannel
和JavaScript对象:
from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot, QUrl
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtWebChannel import QWebChannel
from PyQt6.QtWidgets import QApplication
class MyObject(QObject):
messageReceived = pyqtSignal(str)
@pyqtSlot(str)
def sendMessage(self, message):
self.messageReceived.emit(message)
app = QApplication([])
view = QWebEngineView()
view.load(QUrl("https://www.example.com"))
channel = QWebChannel()
my_object = MyObject()
channel.registerObject("my_object", my_object)
view.page().setWebChannel(channel)
def on_load_finished():
view.page().runJavaScript("myObject.sendMessage('Hello from JavaScript!')")
view.loadFinished.connect(on_load_finished)
view.show()
app.exec()
在这个示例中,我们创建了一个MyObject
类,用于在JavaScript和Python之间传递数据。然后我们创建了一个QWebChannel
对象,并将MyObject
对象注册到该通道中。接下来,我们将QWebChannel
对象设置为WebView的页面。
在on_load_finished()
函数中,我们使用runJavaScript()
方法执行了一个简单的JavaScript代码,该代码调用了MyObject
对象的sendMessage()
方法,并传递了一个字符串参数。
需要注意的是,在JavaScript中访问Python对象时,需要使用qt.webChannelTransport
属性来获取通道对象。例如,在JavaScript中访问MyObject
对象的代码应该像这样:
var myObject = qt.webChannelTransport.objects.my_object;
myObject.sendMessage("Hello from JavaScript!");
在这个示例中,我们使用qt.webChannelTransport.objects.my_object
来获取MyObject
对象,并调用了它的sendMessage()
方法。