importsys,localefromlxmlimportetreefromPyQt4importQtfromPyQt4importQtCorefromPyQt4importQtGuifromPyQt4importQtWebKitimportxml_utils
encoding=locale.getdefaultlocale()[1]classPythonJS(QtCore.QObject):__pyqtSignals__=("contentChanged(const QString &,const QString &)")
@QtCore.pyqtSignature("QString,QString")defonChanged(self, id,msg):#print msg,idself.emit(QtCore.SIGNAL('contentChanged(const QString &,const QString &)'),id, msg)
@QtCore.pyqtSignature("", result="QString")defmessage(self):return"Message!"classMainWindow(QtGui.QMainWindow):def__init__(self):
super(MainWindow,self).__init__()
self.update=True
self.xml=etree.parse('template.xml')
self.tabs=QtGui.QTabWidget(self)
self.browser=QtWebKit.QWebView(self.tabs)
self.edit=QtGui.QPlainTextEdit(self.tabs)
self.tabs.addTab(self.browser,'View')
self.tabs.addTab(self.edit,'Edit')
self.edit.setPlainText(etree.tostring(self.xml,pretty_print=True))
self.pjs=PythonJS()
self.connect(self.edit,QtCore.SIGNAL('textChanged()'),self.onTextChanged)
self.connect(self.pjs,QtCore.SIGNAL('contentChanged(const QString &,const QString &)'),self.onJSMessage)
self.connect(self.browser.page().mainFrame(),QtCore.SIGNAL('javaScriptWindowObjectCleared ()'),self.onObjectClear)
html=xml_utils.XSLTransform(self.xml,'richedit.xsl')
self.browser.setHtml(unicode(html))defonJSMessage(self,id,msg):
self.html=self.browser.page().mainFrame ().toHtml()#print unicode(self.html).encode(encoding)self.setEditText(id,msg)defresizeEvent(self,s):
size=self.size()
self.tabs.resize(size)defsetEditText(self,id,str,update=False):
t=self.update
self.update=update
e=xml_utils.getElementById(self.xml, id)
e.text=unicode(str)
self.edit.setPlainText(etree.tostring(self.xml,pretty_print=True))
self.update=tdefonTextChanged(self):ifself.update:try:
self.xml=etree.fromstring(unicode(self.edit.toPlainText()) )try:
html=xml_utils.XSLTransform(self.xml,'richedit.xsl')
html=unicode(html)ifhtml:
self.browser.setHtml(html)
self.browser.page().mainFrame().addToJavaScriptWindowObject('python',self.pjs)
self.browser.reload()exceptException,e:printeexceptException,e:printedefonObjectClear(self):
self.browser.page().mainFrame().addToJavaScriptWindowObject('python',self.pjs)if__name__=='__main__':
app=QtGui.QApplication(sys.argv)
frame=MainWindow()
frame.show()
sys.exit(app.exec_())