Направи си сам… уеб браузър
Въпреки че ежедневно се занимавам с компютри и съм свикнал с бурното развитие на технологииите, все още има неща в бранша, които ме смайват. Ето например последната версия на библиотеката за програмиране QT 4.4 (произнася се като англииското “cute” – приятен). Едно от новите въведения е реализирането на WebKit – модулен интернет браузър (е не мога да се насиля преведа тая дума като “четец” и това си е!). Още след като бяха пуснати библиотеките PyQT за връзка между Python и Qt 4.4 започнах да се човъркам из кода и за по-малко от два часа (толкова ми отпусна Жорката докато спеше обедния си сън) успях да спретна един много елементарен браузер. Само за сравнение – новата версия на Firefox 3 отне повече от година и половина. Естествено няма място за сравнение на няколко набързо нахвърлени реда код и гигантското постижение което е новия Firefox, но все пак дава перспектива.
Ето как изглежда програмката в действие:
А по-долу е кода на главната програма (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_())
-
Joro:
Здравей,
много бих искал някои да ми обясни някои неща в QT.Абсолютен лаик съм в програмирането на C++.От многото четене разбрах, че се събкалсва основният клас като се модифицира.Искам да направя една елементарна апликаця: три полета QLineEdit, каквото число напишем в първото да се умножава, събира или дели с второто и резултата да се показва в третото.Това би ми помогнало да видя къде и как се пишат Сигналите и слотовете както и мембър функциите.
Sat, 24 Oct 2009, 18:22Благодаря