Направи си сам… уеб браузър

Въпреки че ежедневно се занимавам с компютри и съм свикнал с бурното развитие на технологииите, все още има неща в бранша, които ме смайват. Ето например последната версия на библиотеката за програмиране QT 4.4 (произнася се като англииското “cute” – приятен). Едно от новите въведения е реализирането на WebKit – модулен интернет браузър (е не мога да се насиля преведа тая дума като “четец” и това си е!). Още след като бяха пуснати библиотеките PyQT за връзка между Python и Qt 4.4 започнах да се човъркам из кода и за по-малко от два часа (толкова ми отпусна Жорката докато спеше обедния си сън) успях да спретна един много елементарен браузер. Само за сравнение – новата версия на Firefox 3 отне повече от година и половина. Естествено няма място за сравнение на няколко набързо нахвърлени реда код и гигантското постижение което е новия Firefox, но все пак дава перспектива.
Ето как изглежда програмката в действие:

Toshe Bukov’s PyQt WebKit example

А по-долу е кода на главната програма (webkit_test.py) и на визуалната част (т.нар. GUI – Graphical User Interface) – (Ui_webkit_test.py). Графиния интерфейс е проектиран с QtDesigner а за редактор съм използал Eric4. За сваляне на кода – ето на този адрес: http://toshe.bukov.com/download/toshe_bukov_pyqt_4.4_webkit_example_ver._0.6.zip.


webkit_test.py

# -*- coding: utf-8 -*-
# Author: Toshe Bukov (toshe[at]bukov[dot]com)
# Licence: GNU GPL version 3 or later (http://www.gnu.org/licenses/gpl-3.0.html)
#
# This example can be seen at http://toshe.bukov.com/blog/index.php/post/2008/05/26/130
#

"""
Module implementing MainWindow.
"""
import sys
from PyQt4 import QtGui, QtCore, QtWebKit
from PyQt4.QtGui import QMainWindow
from PyQt4.QtCore import pyqtSignature

from Ui_webkit_test import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    """
    This class implements the container window that consists of address bar, button and
    web page renderer.
    """
    def __init__(self, parent = None):
        """
        Class constructor.
        """
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.loadingURL = ""
        #self.setWindowTitle("PyQt4.4 WebKit browser demo")
        
    @pyqtSignature("")
    def on_urlBar_returnPressed(self):
        """
        This method is invoked when Enter/Return keyboard key is pressed.
        """
        urlText = str(self.urlBar.text()).lower()
        if not urlText.startswith("http://"):
            urlText = "http://" + urlText
        self.loadingURL = urlText
        urlAddress = QtCore.QUrl(urlText)
        self.webView.load(urlAddress)
    
    @pyqtSignature("")
    def on_goButton_clicked(self):
        """
        This method is invoked when "Go" button is clicked. 
        """
        self.on_urlBar_returnPressed()
        
    @pyqtSignature("")
    def on_webView_loadStarted(self):
        """
        QT invokes this method when page is being loaded in WebKit widget.
        """
        self.statusbar.showMessage("Loading " + self.loadingURL)
    
    @pyqtSignature("bool")
    def on_webView_loadFinished(self, p0):
        """
        This method is invoked when page load is complete.
        """
        self.statusbar.showMessage("Done. (" + self.webView.url().toString() + ")")
    
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

Ui_webkit_test.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'webkit_test.ui'
#
# Created: Mon May 26 15:53:38 2008
#      by: PyQt4 UI code generator 4.4.2
#
# Author: Toshe Bukov (toshe[at]bukov[dot]com)
# Licence: GNU GPL version 3 or later (http://www.gnu.org/licenses/gpl-3.0.html)
#
# This example can be seen at http://toshe.bukov.com/blog/index.php/post/2008/05/26/130
#
from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800,600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setGeometry(QtCore.QRect(0,27,800,548))
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.urlBar = QtGui.QLineEdit(self.centralwidget)
        self.urlBar.setObjectName("urlBar")
        self.horizontalLayout.addWidget(self.urlBar)
        self.goButton = QtGui.QPushButton(self.centralwidget)
        self.goButton.setObjectName("goButton")
        self.horizontalLayout.addWidget(self.goButton)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.webView = QtWebKit.QWebView(self.centralwidget)
        self.webView.setUrl(QtCore.QUrl("about:blank"))
        self.webView.setObjectName("webView")
        self.verticalLayout.addWidget(self.webView)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,0,800,27))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtGui.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setGeometry(QtCore.QRect(0,575,800,25))
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionExit = QtGui.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.menuFile.addAction(self.actionExit)
        self.menubar.addAction(self.menuFile.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.actionExit,QtCore.SIGNAL("triggered()"),MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Python QT4.4 Webkit test", None, QtGui.QApplication.UnicodeUTF8))
        self.goButton.setText(QtGui.QApplication.translate("MainWindow", "Go", None, QtGui.QApplication.UnicodeUTF8))
        self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
        self.actionExit.setText(QtGui.QApplication.translate("MainWindow", "Exit", None, QtGui.QApplication.UnicodeUTF8))

# -- uncomment below code to test the GUI code
#from PyQt4 import QtWebKit
#
#if __name__ == "__main__":
#    import sys
#    app = QtGui.QApplication(sys.argv)
#    MainWindow = QtGui.QMainWindow()
#    ui = Ui_MainWindow()
#    ui.setupUi(MainWindow)
#    MainWindow.show()
#    sys.exit(app.exec_())

One thought on “Направи си сам… уеб браузър

  1. Здравей,

    много бих искал някои да ми обясни някои неща в QT.Абсолютен лаик съм в програмирането на C++.От многото четене разбрах, че се събкалсва основният клас като се модифицира.Искам да направя една елементарна апликаця: три полета QLineEdit, каквото число напишем в първото да се умножава, събира или дели с второто и резултата да се показва в третото.Това би ми помогнало да видя къде и как се пишат Сигналите и слотовете както и мембър функциите.
    Благодаря

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.