<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 67  文章 - 79  trackbacks - 0
    <2008年8月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    書接上回,繼續(xù)研究WebKit 實(shí)現(xiàn)了夢(mèng)幻中的三位一體式的XmlRichEdit
    示范效果:

    在View面板上的修改能體現(xiàn)在Edit上
    同樣修改了Edit 也能體現(xiàn)在View面板上

    同時(shí)數(shù)據(jù)使用xml描述,xslt轉(zhuǎn)換到html,使用webkit渲染html并響應(yīng)其中的html事件
    以后只要修改xml和xslt就能產(chǎn)生不同的效果

    xml 表達(dá) 數(shù)據(jù)Model:
    template.xml
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="richedit.xsl"?>
    <document id='doc'>
    <title id='title'>Template</title>
    <text id='text'>1234567891234</text>
    </document>

    xsl 將xml轉(zhuǎn)換到html:
    richedit.xsl
    <xsl:stylesheet version="1.0"
        xmlns:xsl
    ='http://www.w3.org/1999/XSL/Transform'>
        
    <xsl:output method="html" />

        
    <xsl:template match="document">
            
    <html>
                
    <head>
                    
    <meta http-equiv="content-type"
                        content
    ="text/html; charset=UTF-8" />
                    
    <script type="text/javascript">
                        function onChanged(e,id) { var element
                        =document.getElementById(id);
                        python.onChanged(id,element.textContent); }
                    
    </script>
                
    </head>
                
    <body>
                    
    <div>
                        
    <xsl:attribute name='id'>
                    
    <xsl:value-of select='@id' />
                
    </xsl:attribute>
                        
    <xsl:apply-templates />
                    
    </div>
                
    </body>
            
    </html>
        
    </xsl:template>

        
    <xsl:template match="title">
            
    <div>
                
    <h1>
            
    <xsl:attribute name='id'>
                
    <xsl:value-of select='@id' />
            
    </xsl:attribute>

            
    <xsl:attribute name='contenteditable'>
              
    <xsl:text>true</xsl:text>
            
    </xsl:attribute>
            
            
    <xsl:attribute name='onkeyup'>
              
    <xsl:text>onChanged(event,'</xsl:text>
              
    <xsl:value-of select='@id' />
              
    <xsl:text>')</xsl:text>
            
    </xsl:attribute>

            
    <xsl:value-of select='.' />
                
    </h1>
            
    </div>
        
    </xsl:template>

        
    <xsl:template match="text">
            
    <div>
                
    <p>
            
    <xsl:attribute name='id'>
                
    <xsl:value-of select='@id' />
            
    </xsl:attribute>

            
    <xsl:attribute name='contenteditable'>
              
    <xsl:text>true</xsl:text>
            
    </xsl:attribute>

            
    <xsl:attribute name='onkeyup'>
              
    <xsl:text>onChanged(event,'</xsl:text>
              
    <xsl:value-of select='@id' />
              
    <xsl:text>')</xsl:text>
            
    </xsl:attribute>

                    
    <xsl:value-of select='.' />
                
    </p>
            
    </div>
        
    </xsl:template>

    </xsl:stylesheet>

    python腳本 將html渲染到WebKit:
    xml_utils.py
    from lxml import etree

    def getElementById(doc,id):
         
    return doc.xpath("//*[@id='%s']"%id)[0]
     
    def XSLTransform(xml,xslt):
        
    try:
            
    return xslt(xml)
        
    except Exception,e:
            transform
    =etree.XSLT(etree.parse(xslt))
            
    try:
                
    return transform(xml)
            
    except Exception,e:
                root
    =etree.parse(xml)
                
    return transform(root)
         
    if __name__=='__main__':
        
    print XSLTransform('template.xml''richedit.xsl')
      

    sample.py
    import sys,locale
    from lxml import etree
    from PyQt4 import Qt
    from PyQt4 import QtCore
    from PyQt4 import QtGui
    from PyQt4 import QtWebKit

    import xml_utils

    encoding
    =locale.getdefaultlocale()[1]



    class PythonJS(QtCore.QObject):
        
        
    __pyqtSignals__ = ("contentChanged(const QString &,const QString &)")
        
        @QtCore.pyqtSignature(
    "QString,QString")
        
    def onChanged(self, id,msg):
            
    #print msg,id
            self.emit(QtCore.SIGNAL('contentChanged(const QString &,const QString &)'),id, msg)

        @QtCore.pyqtSignature(
    "", result="QString")
        
    def message(self): 
            
    return "Message!"

    class MainWindow(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))
            
        
    def onJSMessage(self,id,msg):
            
            self.html
    = self.browser.page().mainFrame ().toHtml()
            
    #print unicode(self.html).encode(encoding)
            self.setEditText(id,msg)
            
        
    def resizeEvent(self,s):
            size
    =self.size()
            self.tabs.resize(size)

        
    def setEditText(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
    =t
            
                
        
    def onTextChanged(self):
            
    if self.update:
                
    try:
                    self.xml
    = etree.fromstring(unicode(self.edit.toPlainText()) )
                    
    try:
                        html
    =xml_utils.XSLTransform(self.xml, 'richedit.xsl')
                        html
    =unicode(html)
                        
    if html:
                            self.browser.setHtml(html)
                            self.browser.page().mainFrame().addToJavaScriptWindowObject(
    'python',self.pjs) 
                            self.browser.reload()
                    
    except Exception,e:
                        
    print e
                
    except Exception,e:
                    
    print e
                
        
    def onObjectClear(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_())       
            





    posted on 2008-08-01 12:01 zarra 閱讀(2406) 評(píng)論(4)  編輯  收藏

    FeedBack:
    # re: 使用Webkit和xml、xslt 實(shí)現(xiàn)html風(fēng)格的RichEdit試驗(yàn)[未登錄] 2008-08-03 13:09 apple
    牛人啊~~~剛開始的代碼還能看懂,再往下看只能一楞塄的了!!  回復(fù)  更多評(píng)論
      
    # re: 使用Webkit和xml、xslt 實(shí)現(xiàn)html風(fēng)格的RichEdit試驗(yàn) 2008-08-04 11:16 zarra
    是webkit功能強(qiáng)大 ,雖說這些類似Xulrunner風(fēng)格的gui框架,是給沒有g(shù)ui編程經(jīng)驗(yàn)的設(shè)計(jì)師們準(zhǔn)備的,但是卻給了統(tǒng)一文檔,視圖框架的契機(jī)  回復(fù)  更多評(píng)論
      
    # re: 使用Webkit和xml、xslt 實(shí)現(xiàn)html風(fēng)格的RichEdit試驗(yàn) 2008-08-27 09:56 gushanke
    QT版的,我要wx版的使用指南啊,QT的lincense不行啊  回復(fù)  更多評(píng)論
      
    # re: 使用Webkit和xml、xslt 實(shí)現(xiàn)html風(fēng)格的RichEdit試驗(yàn)[未登錄] 2008-08-28 11:00 zarra
    qt比wxwidget成熟多了 自己寫東西 用qt方便很多
    wx的webkit 還沒有成氣候,再加上wx本身在類基礎(chǔ)上的輕量級(jí),所以很難設(shè)想 簡(jiǎn)單的將wx類導(dǎo)入到webkit里面使用
    如果商業(yè)開發(fā) 購買qt的授權(quán)和學(xué)習(xí)wx 估計(jì)二者所花的成本差不多  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费无码看av的网站| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲欧美成人一区二区三区| 亚洲国产成人高清在线观看| 免费观看国产精品| 99久久国产热无码精品免费| 久久精品乱子伦免费| 成人福利在线观看免费视频| 亚洲av无码专区亚洲av不卡| 亚洲最大中文字幕| 亚洲AV第一页国产精品| 亚洲中文字幕无码久久综合网| 国产无遮挡又黄又爽免费视频| 成人午夜大片免费7777| 国产黄色免费网站| 中文字幕亚洲免费无线观看日本 | 亚洲 小说区 图片区 都市| 日韩av无码成人无码免费| 99视频在线看观免费| 最近中文字幕免费大全| 精精国产www视频在线观看免费| 美女露100%胸无遮挡免费观看| 亚洲精品无码国产片| 亚洲日韩看片无码电影| 伊人久久五月丁香综合中文亚洲| 亚洲国语在线视频手机在线| 亚洲性69影院在线观看| 亚洲日本在线观看网址| 亚洲国产成人久久精品app| 亚洲精品永久www忘忧草| 亚洲av日韩av不卡在线观看| 亚洲人成网www| 亚洲伦另类中文字幕| 91天堂素人精品系列全集亚洲| 老司机亚洲精品影院无码| 亚洲系列中文字幕| 亚洲自偷自拍另类图片二区| 亚洲综合激情九月婷婷| 亚洲av无码片区一区二区三区| 亚洲看片无码在线视频| 婷婷国产偷v国产偷v亚洲|