PyQt QtWebKit - 将Python方法的值直接返回给JavaScript

时间:2014-11-19 15:27:32

标签: javascript python pyqt4 qtwebkit method-signature

修改

我在这里找到了一个解决方案: how do I correctly return values from pyqt to JavaScript?

我会先发布代码:

Python代码:

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

    @pyqtSlot(bool)
    def fromJStoPython(self, param):
        print param
        print param.toBool()
    @pyqtSlot()
    def returnValue()
        return "hello world"

class another():
    ...
    view = QWebView()
    frame = view.page().mainFrame()

    param = "blabla"
    frame.evaluateJavaScript("printIt('" + param + "');")
    paramBool = True
    frame.evaluateJavaScript("fromPythonWithParameterBool('" + paramBool + "');")

JavaScript的:

function printIt(param)
{
    alert(param);
}
function toPython()
{
    jsBridgeInst.fromJStoPython(true);
}
// now here functions I've questions about:
function fromPythonWithParameterBool(param)
{
    alert(param);
}
function fromPythonReturnValue()
{
    res = jsBridgeInst.returnValue();
    alert(res);
}

现在问我的问题:

printIt功能正常。所以param被解释为String。 fromJStoPython函数也可以正常工作。 print语句显示为QVariant

但是fromPythonWithParameterBool函数不起作用,因为我必须将paramBool转换为字符串才能连接它。如果我这样做,它打印字符串值(但我希望它是布尔值)。是否可以传递布尔值,以便在JavaScript中我可以将它作为布尔值使用?如果是的话,你是怎么做到的?

对于fromPythonReturnValue函数,它不会显示错误,但res未定义。为什么? 我正在寻找这个问题,但大多数示例/教程都显示标准的东西,如:

evaluateJavaScript("alert('9')";)

我使用过Java和SWT,在那里我只需返回一个值(如formPythonReturnValue方法)。有一个Browser类,您可以在其中实现调用方法,就像JSBridge一样。

1 个答案:

答案 0 :(得分:0)

fromPythonWithParameterBool不起作用,因为您没有生成可以作为javascript计算的输入字符串。

你需要做的是这样的事情:

>>> script = 'fromPythonWithParameterBool(%s);' % str(bool(paramBool)).lower()
>>> print(script)
fromPythonWithParameterBool(true);

因此,结果字符串现在是有效javascript的片段。

fromPythonReturnValue的问题(正如您已经发现的那样)是您没有指定返回值的类型。必须使用pyqtSlot decorator

明确地完成此操作
    @pyqtSlot(result=str)
    def returnValue(self):
        return 'hello world'