在PyQt5和PyQt6中,QWebChannel
类的connection()
方法返回的对象类型已经从QObject
改为了QWebChannelAbstractTransport
。因此,在调用javaScriptWindowObjectCleared
信号时,需要使用QWebChannelAbstractTransport
类的disconnect()
方法来断开信号的连接。
以下是一个示例代码,演示如何在PyQt6中使用QWebChannel
和javaScriptWindowObjectCleared
信号:
from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot, QUrl
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtWebChannel import QWebChannel, QWebChannelAbstractTransport
from PyQt6.QtWidgets import QApplication
class MyObject(QObject):
def __init__(self):
super().__init__()
@pyqtSlot(str)
def showMessage(self, message):
print(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)
class Connection(QWebChannelAbstractTransport):
def sendMessage(self, message):
self.messageReceived.emit(message)
messageReceived = pyqtSignal(str)
connection = Connection()
channel.connectTo(connection, QUrl("qtwebchannel:"))
def on_java_script_window_object_cleared():
connection.messageReceived.connect(my_object.showMessage)
view.page().runJavaScript("myObject.showMessage('Hello from JavaScript!')")
view.page().javaScriptWindowObjectCleared.connect(on_java_script_window_object_cleared)
view.show()
app.exec()
在这个示例中,我们创建了一个MyObject
类,用于在JavaScript和Python之间传递数据。然后我们创建了一个QWebChannel
对象,并将MyObject
对象注册到该通道中。接下来,我们将QWebChannel
对象设置为WebView的页面,并创建了一个Connection
对象来连接JavaScript和Python之间的通道。
在on_java_script_window_object_cleared()
函数中,我们使用connect()
方法将messageReceived
信号连接到MyObject
对象的showMessage()
槽函数。然后我们使用runJavaScript()
方法执行了一个简单的JavaScript代码,该代码调用了MyObject
对象的showMessage()
方法,并传递了一个字符串参数。
需要注意的是,在PyQt6中,QWebChannelAbstractTransport
类的sendMessage()
方法已经改为了纯虚函数,因此你需要在子类中实现该方法。在这个示例中,我们使用messageReceived
信号来模拟接收JavaScript发送的消息。