2016-09-17 75 views
0

我用来做它通过连接对象如何在PyQT 5.7中从JavaScript访问Python代码?

self.page().mainFrame().addToJavaScriptWindowObject("js_interface", self.jsi) 

在5.7我做的:

self.page().setWebChannel(self.jsi) 

但我understandibly得到一个JavaScript错误,当我尝试访问公开的函数:

js: Uncaught ReferenceError: js_interface is not defined 

谷歌搜索我发现我应该使用qwebchannel.js,但我找不到文件或说明如何在任何地方使用它(有一些信息,但仅在安装QT时提供的一些示例中,而不是PyQT)。

回答

1

看看this page。它包含一个有用的例子(在C++中,但很容易翻译成python)。

首先,您必须使用websocket从html通信到您的应用程序,反之亦然。

然后你可以设置你的QWebChannel。

9

可以qwebchannel.js到HTML页面使用脚本标签包括:

<script src="qrc:///qtwebchannel/qwebchannel.js"></script> 

然后,创建蟒侧的网络渠道:

from PyQt5.QtCore import QObject, pyqtSlot 
from PyQt5.QtWebChannel import QWebChannel 
from PyQt5.QtWebEngineWidgets import QWebEngineView 

class CallHandler(QObject): 
    @pyqtSlot() 
    def test(self): 
     print('call received') 

view = QWebEngineView() 
channel = QWebChannel() 
handler = CallHandler() 
channel.registerObject('handler', handler) 
view.page().setWebChannel(channel) 

JS代码与交互网络频道:

new QWebChannel(qt.webChannelTransport, function (channel) { 
    window.handler = channel.objects.handler; 
    window.handler.test(); 
}); 
+2

另外:请确保'channel','handler'等不被垃圾回收。我正在用class-method初始化它们,我无法弄清楚它为什么不起作用,甚至被隔离。技巧是在类中保留对'channel'和'handler'的引用(例如'self.handler = CallHandler()'etc – devsnd

0

我觉得这很大d在PyQT5.9 +中,JS不能直接与Python进行通信,就像它用于“addToJavaScriptWindowObject”命令一样。 并使用websockets ...如果防火墙很重,并且所有端口都被阻塞,该怎么办?

我想我会依靠简单的回调(从Python到JS的长池类型检查更改/命令)的方法,并没有QTWebChannel的用法。

相关问题