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

Въпреки че ежедневно се занимавам с компютри и съм свикнал с бурното развитие на технологииите, все още има неща в бранша, които ме смайват. Ето например последната версия на библиотеката за програмиране 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

  1.  
  2. # -*- coding: utf-8 -*-
  3. # Author: Toshe Bukov (toshe[at]bukov[dot]com)
  4. # Licence: GNU GPL version 3 or later (http://www.gnu.org/licenses/gpl-3.0.html)
  5. #
  6. # This example can be seen at http://toshe.bukov.com/blog/index.php/post/2008/05/26/130
  7. #
  8.  
  9. """
  10. Module implementing MainWindow.
  11. """
  12. import sys
  13. from PyQt4 import QtGui, QtCore, QtWebKit
  14. from PyQt4.QtGui import QMainWindow
  15. from PyQt4.QtCore import pyqtSignature
  16.  
  17. from Ui_webkit_test import Ui_MainWindow
  18.  
  19. class MainWindow(QMainWindow, Ui_MainWindow):
  20.     """
  21.    This class implements the container window that consists of address bar, button and
  22.    web page renderer.
  23.    """
  24.     def __init__(self, parent = None):
  25.         """
  26.        Class constructor.
  27.        """
  28.         QMainWindow.__init__(self, parent)
  29.         self.setupUi(self)
  30.         self.loadingURL = ""
  31.         #self.setWindowTitle("PyQt4.4 WebKit browser demo")
  32.        
  33.     @pyqtSignature("")
  34.     def on_urlBar_returnPressed(self):
  35.         """
  36.        This method is invoked when Enter/Return keyboard key is pressed.
  37.        """
  38.         urlText = str(self.urlBar.text()).lower()
  39.         if not urlText.startswith("http://"):
  40.             urlText = "http://" + urlText
  41.         self.loadingURL = urlText
  42.         urlAddress = QtCore.QUrl(urlText)
  43.         self.webView.load(urlAddress)
  44.    
  45.     @pyqtSignature("")
  46.     def on_goButton_clicked(self):
  47.         """
  48.        This method is invoked when "Go" button is clicked.
  49.        """
  50.         self.on_urlBar_returnPressed()
  51.        
  52.     @pyqtSignature("")
  53.     def on_webView_loadStarted(self):
  54.         """
  55.        QT invokes this method when page is being loaded in WebKit widget.
  56.        """
  57.         self.statusbar.showMessage("Loading " + self.loadingURL)
  58.    
  59.     @pyqtSignature("bool")
  60.     def on_webView_loadFinished(self, p0):
  61.         """
  62.        This method is invoked when page load is complete.
  63.        """
  64.         self.statusbar.showMessage("Done. (" + self.webView.url().toString() + ")")
  65.    
  66. if __name__ == "__main__":
  67.     app = QtGui.QApplication(sys.argv)
  68.    
  69.     mw = MainWindow()
  70.     mw.show()
  71.     sys.exit(app.exec_())
  72.  

Ui_webkit_test.py

  1.  
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Form implementation generated from reading ui file ‘webkit_test.ui’
  5. #
  6. # Created: Mon May 26 15:53:38 2008
  7. #      by: PyQt4 UI code generator 4.4.2
  8. #
  9. # Author: Toshe Bukov (toshe[at]bukov[dot]com)
  10. # Licence: GNU GPL version 3 or later (http://www.gnu.org/licenses/gpl-3.0.html)
  11. #
  12. # This example can be seen at http://toshe.bukov.com/blog/index.php/post/2008/05/26/130
  13. #
  14. from PyQt4 import QtCore, QtGui
  15.  
  16. class Ui_MainWindow(object):
  17.     def setupUi(self, MainWindow):
  18.         MainWindow.setObjectName("MainWindow")
  19.         MainWindow.resize(800,600)
  20.         self.centralwidget = QtGui.QWidget(MainWindow)
  21.         self.centralwidget.setGeometry(QtCore.QRect(0,27,800,548))
  22.         self.centralwidget.setObjectName("centralwidget")
  23.         self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
  24.         self.verticalLayout.setObjectName("verticalLayout")
  25.         self.horizontalLayout = QtGui.QHBoxLayout()
  26.         self.horizontalLayout.setObjectName("horizontalLayout")
  27.         self.urlBar = QtGui.QLineEdit(self.centralwidget)
  28.         self.urlBar.setObjectName("urlBar")
  29.         self.horizontalLayout.addWidget(self.urlBar)
  30.         self.goButton = QtGui.QPushButton(self.centralwidget)
  31.         self.goButton.setObjectName("goButton")
  32.         self.horizontalLayout.addWidget(self.goButton)
  33.         self.verticalLayout.addLayout(self.horizontalLayout)
  34.         self.webView = QtWebKit.QWebView(self.centralwidget)
  35.         self.webView.setUrl(QtCore.QUrl("about:blank"))
  36.         self.webView.setObjectName("webView")
  37.         self.verticalLayout.addWidget(self.webView)
  38.         MainWindow.setCentralWidget(self.centralwidget)
  39.         self.menubar = QtGui.QMenuBar(MainWindow)
  40.         self.menubar.setGeometry(QtCore.QRect(0,0,800,27))
  41.         self.menubar.setObjectName("menubar")
  42.         self.menuFile = QtGui.QMenu(self.menubar)
  43.         self.menuFile.setObjectName("menuFile")
  44.         MainWindow.setMenuBar(self.menubar)
  45.         self.statusbar = QtGui.QStatusBar(MainWindow)
  46.         self.statusbar.setGeometry(QtCore.QRect(0,575,800,25))
  47.         self.statusbar.setObjectName("statusbar")
  48.         MainWindow.setStatusBar(self.statusbar)
  49.         self.actionExit = QtGui.QAction(MainWindow)
  50.         self.actionExit.setObjectName("actionExit")
  51.         self.menuFile.addAction(self.actionExit)
  52.         self.menubar.addAction(self.menuFile.menuAction())
  53.  
  54.         self.retranslateUi(MainWindow)
  55.         QtCore.QObject.connect(self.actionExit,QtCore.SIGNAL("triggered()"),MainWindow.close)
  56.         QtCore.QMetaObject.connectSlotsByName(MainWindow)
  57.  
  58.     def retranslateUi(self, MainWindow):
  59.         MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Python QT4.4 Webkit test", None, QtGui.QApplication.UnicodeUTF8))
  60.         self.goButton.setText(QtGui.QApplication.translate("MainWindow", "Go", None, QtGui.QApplication.UnicodeUTF8))
  61.         self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
  62.         self.actionExit.setText(QtGui.QApplication.translate("MainWindow", "Exit", None, QtGui.QApplication.UnicodeUTF8))
  63.  
  64. # — uncomment below code to test the GUI code
  65. #from PyQt4 import QtWebKit
  66. #
  67. #if __name__ == "__main__":
  68. #    import sys
  69. #    app = QtGui.QApplication(sys.argv)
  70. #    MainWindow = QtGui.QMainWindow()
  71. #    ui = Ui_MainWindow()
  72. #    ui.setupUi(MainWindow)
  73. #    MainWindow.show()
  74. #    sys.exit(app.exec_())
  75.  

One Comment

  1. Joro:

    Здравей,

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

Leave a comment