QtWebKit桥:调用JavaScript函数

时间:2014-12-21 14:41:55

标签: javascript python qt pyside qwebkit

我正在编写一个带有HTML接口和Python代码的混合应用程序。 我可以通过共享对象访问Python函数:

pythonPart.py

class BO(QObject):
    def __init__(self, parent=None):
        super(BO, self).__init__(parent)

    @Slot(str)
    def doStuff(self, txt):
        print(txt)

bridgeObj = BO()

# init stuff and frame...
frame.addToJavaScriptWindowObject( 'pyBridge', bridgeObj )
frame.evaluateJavaScript('alert("Alert from Python")')
frame.evaluateJavaScript('testMe()')
frame.evaluateJavaScript('alert("Starting test");testMe();alert("Test over")')

jsPart.js

function testMe() { alert('js function testMe called'); }

pyBridge.doStuff("bla");
testMe();

从JS调用Python函数,以及从JS调用testMe。从Python中调用像alert这样的“标准”JS函数也可以。

最后两行Python行不会: evaluateJavaScript("testMe()")根本不做任何事情。 最后一行执行第一个警报,之后不再继续。

编辑:我已经尝试在加载和调用time.sleep()之间有一些evaluateJavaScript,我正在从本地计算机上加载网页。

2 个答案:

答案 0 :(得分:1)

最可能的问题是JavaScript尚未加载。添加time.sleep()调用对此没有帮助,这些调用也会阻止Qt事件循环继续,而不仅仅是Python代码。

尝试等待页面完全加载,例如(使用the loadFinished signal

def onLoad():
    frame.evaluateJavaScript('testMe()')

frame.loadFinished.connect(onLoad)

另外,为了在这种情况下获取更多调试信息,您可能希望实现QtWebKit.QWebPage.javaScriptConsoleMessage

答案 1 :(得分:1)

示例代码中至少有两个错误。

首先,当您将对象添加到javascript窗口时,您将其称为“pyBridge”,但您尝试在javascript中将其引用为“bridgeObj”。显然,这将抛出ReferenceError,这将阻止进一步执行脚本。

其次,doStuff方法缺少self参数,这将导致PySide引发TypeError

处理这两个问题应该足以修复您的示例代码,只要您确保在加载html之前将桥对象添加到javacsript窗口。如果要在顶级JavaScript代码中引用桥对象,则需要执行此步骤。但是,如果桥接对象仅在函数级代码中引用,则可以在加载html后将其安全地添加到javascript窗口中。