addToJavaScriptWindowObject bei QWebFrame

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
macmallow
User
Beiträge: 14
Registriert: Dienstag 12. Mai 2009, 17:31

Hallo, ich versuch ein simples Objekt für javascript zugänglich zu machen, allerdings klappt das noch nicht wirklich:

1) Mein Objekt:

Code: Alles auswählen

class JavaScriptLogger(QtCore.QObject):
    def __init__(self):
        QtCore.QObject.__init__(self)
        """Constructor"""
    #----------------------------------------------------------------------
    def out(self,text):
        """prints some text"""
        QtGui.QMessageBox("hey",text)      
 
2) der Javascript code:
logger.out(point.x+' '+point.y);

3) so "verbinde ich das ganze":

Code: Alles auswählen

        logger = JavaScriptLogger()
        frame = self.ui.webView.page().mainFrame()
        frame.addToJavaScriptWindowObject("logger",logger)
Leider passiert einfach rein gar nichts :( .
Kann mir da bitte wer weiterhelfen? Danke!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Mit etwas mehr Code könnte man vllt. auch sagen, woran es klemmt.

Hier mal ein Bsp dazu:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
from PyQt4 import QtGui, QtCore, QtWebKit

HTML = '<html><body><input type="text" id="line" value="###"/></body></html>'

class MyObject(QtCore.QObject):
    def __init__(self):
        QtCore.QObject.__init__(self)
        self._prop = 'Hiho!'
    
    def getProp(self):
        return self._prop
    def setProp(self, text):
        self._prop = text
    prop = QtCore.pyqtProperty("QString", getProp, setProp)
    
    @QtCore.pyqtSignature("QString")
    def alertIt(self, text):
        msg = QtGui.QMessageBox(None)
        msg.setText(text)
        msg.exec_()

class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 50)
        self.webview = QtWebKit.QWebView(self)
        self.webview.setHtml(HTML)
        obj = MyObject()
        frame = self.webview.page().mainFrame()
        frame.addToJavaScriptWindowObject("my_obj", obj)
        # prop lesen in JS
        frame.evaluateJavaScript(u"document.getElementById('line').value = my_obj.prop;")
        # prop ändern in JS
        frame.evaluateJavaScript(u"my_obj.prop = 'In JS geändert!';")
        # prop lesen in python
        print obj.prop # --> In JS geändert!
        # methode ausführen
        frame.evaluateJavaScript(u"my_obj.alertIt('Text in Messagebox.');")

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win = MyWidget()
    win.show()
    sys.exit(app.exec_())
Damit PyQt Attribute und Methoden mappen kann, ist es wichtig, diese als pyqtProperty bzw. Slot zu markieren.
macmallow
User
Beiträge: 14
Registriert: Dienstag 12. Mai 2009, 17:31

Thx, mit @pyqtSignature hats geklappt .. War ne schwere Geburt :)
Antworten