Enjoy!
Il existe déjà pas mal de démos PyQt4 utilisant le QtWebKit mais je n'en ai pas trouvé aussi complète que le fancy browser. Le code joint en est une traduction assez fidèle.
J'ai juste pris quelques libertés avec le chargement de JQuery et raccourci un peu les appels à javascript.
- W


Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from PyQt4.QtWebKit import QWebView, QWebPage
from PyQt4.QtCore import QUrl, QObject, SIGNAL
from PyQt4.QtGui import QApplication, QMainWindow, QLineEdit, QSizePolicy, \
                        QAction, QStyle
 
 
def url_fetch(url, path):
    from urllib import urlretrieve
 
    name = os.path.basename(url)
    fullname = "%(path)s/%(name)s" % vars()
    if not os.path.exists(fullname):
        urlretrieve(url, fullname)
    with open(fullname, 'r') as f:
        buffer = f.read()
    return buffer
 
 
class Browser(QMainWindow):
 
    def __init__(self, url, jquery):
        super(Browser, self).__init__()
 
        self._progress = 0
 
        self._jquery = jquery
        self._js_loaded = False
        connect = self.connect
 
        # create WebView
        view = self._view = QWebView()
        view.load(QUrl(url))
        connect(view, SIGNAL("loadFinished (bool)"), self._adjustLocation)
        connect(view,SIGNAL("titleChanged(const QString&)"), self._adjustTitle);
        connect(view,SIGNAL("loadProgress(int)"), self._setProgress);
        connect(view,SIGNAL("loadFinished(bool)"), self._finishLoading);
        # setup location editable line
        locationEdit = self._locationEdit = QLineEdit()
        locationEdit.setSizePolicy(QSizePolicy.Expanding,
            locationEdit.sizePolicy().verticalPolicy())
        connect(locationEdit, SIGNAL("returnPressed()"), self._changeLocation)
        # setup toolbar
        toolBar = self._toolBar = self.addToolBar("Navigation")
        actions = map(view.pageAction, [ QWebPage.Back, QWebPage.Forward,
                    QWebPage.Reload, QWebPage.Stop])
        toolBar.addActions(actions)
        toolBar.addWidget(locationEdit)
        # setup effects menu
        effectMenu = self._effectMenu = self.menuBar().addMenu("&Effect")
        code = r"""
            $('a').each( function () {
                $(this).css('background-color', 'yellow') } )
            """
        effectMenu.addAction("Highlight all links", lambda: self._eval_js(code))
        rotateAction = self._rotateAction = QAction(self)
        rotateAction.setIcon(self.style().standardIcon(QStyle.SP_FileDialogDetailedView))
        rotateAction.setCheckable(True)
        rotateAction.setText("Turn images upside down")
        connect(rotateAction, SIGNAL("toggled(bool)"), self._rotateImages)
        effectMenu.addAction(rotateAction)
        # setup tools menu
        toolsMenu = self._toolsMenu = self.menuBar().addMenu("&Tools")
        toolsMenu.addAction("Remove all GIF images",
                lambda: self._eval_js(r"$('[src*=gif]').remove()"))
        toolsMenu.addAction("Remove all inline frames",
                lambda: self._eval_js( r"$('iframe').remove()"))
        toolsMenu.addAction("Remove all object elements",
                lambda: self._eval_js(r"$('object').remove()"))
        toolsMenu.addAction("Remove all embedded elements",
                lambda: self._eval_js(r"$('embed').remove()"))
        # set everything together
        self.setCentralWidget(view);
        # grabs frame
        self._frame = view.page().mainFrame()
 
    def _adjustLocation(self): 
        self._locationEdit.setText(self._view.url().toString());
 
    def _changeLocation(self):
        url = QUrl(self._locationEdit.text())
        view = self._view
        view.load(url)
        view.setFocus()
 
    def _adjustTitle(self): 
        view = self._view
        progress = self._progress
        if progress <= 0 or progress >= 100:
            self.setWindowTitle(view.title())
        else: self.setWindowTitle("%s (%s %%)" % (view.title(), progress))
 
    def _setProgress(self, p):
        self._progress = p
        self._adjustTitle()
 
    def _finishLoading(self, bool):
        self._progress = 100
        self._adjustTitle()
        self._js_loaded = False
 
    def _rotateImages(self, toggle):
        code = r"""$('img').each( function () {
                $(this).css('-webkit-transition', '-webkit-transform 2s') } )"""
        self._eval_js(code)
        if (toggle):
            code = r"""$('img').each( function () {
                    $(this).css('-webkit-transform', 'rotate(180deg)') } )"""
        else:
            code = r"""$('img').each( function () {
                    $(this).css('-webkit-transform', 'rotate(0deg)') } )"""
        self._eval_js(code)
 
    def _eval_js(self, js_code):
        js_eval = self._frame.evaluateJavaScript
        if not self._js_loaded: 
             js_eval(self._jquery)
             self._js_loaded = True
        js_eval(js_code)
 
if __name__ == '__main__':
    import sys
    import os
 
    URL = 'http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js'
    PATH = os.getcwd()
    jquery = url_fetch(URL, PATH)
 
    app = QApplication(sys.argv)
    Browser('http://www.google.com/ncr', jquery).show()
    sys.exit(app.exec_())