PyQT webkit - пример использования

Рассмотрим некоторые базовые приёмы использования PyQT webkit .

Для начала просто откроем html-страничку внутри нашей формы:

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

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)

web = QWebView()
#откроем некоммерческую версию страницу яндекса
web.load(QUrl("123")) # 123=  http://ya.ru
# показываем окно
web.show()

sys.exit(app.exec_())

Движемся дальше

А теперь давайте рассмотрим пример позволяющий добавить в наш браузер:

  1. адресную строку
  2. кнопки "предыдущая/следующая"
  3. кнопку перезагрузки страницы
  4. кнопку отмены загрузки

мы будем использовать два файла с исходниками
- в первом пользовательский интерфейс окна нашего браузера:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
from PyQt4 import QtWebKit

"""
класс который мы опишем ниже
будет отвечать а внешний вид
нашего первобытного браузера
"""
class Ui_HttpWidget(object):

#в контсрукторе получаем класс типа HttpWidget """
    def setupUi(self, HttpWidget):

        HttpWidget.setObjectName("HttpWidget")
        HttpWidget.resize(500, 336)

        self.verticalLayout = QtGui.QVBoxLayout(HttpWidget)
        self.verticalLayout.setObjectName("verticalLayout")

        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")

        # добавляем кнопку "прдыдущая(назад)"
        self.back = QtGui.QPushButton(HttpWidget)
        self.horizontalLayout.addWidget(self.back)


        # добавляем кнопку "следующая(вперёд)"
        self.next = QtGui.QPushButton(HttpWidget)
        self.next.setEnabled(True) # разрешаем нажатие
        self.next.setLayoutDirection(QtCore.Qt.RightToLeft)

        self.next.setObjectName("next")
        self.horizontalLayout.addWidget(self.next)



        # добавляем кнопку остановки загрузки
        self.stop = QtGui.QPushButton(HttpWidget)
        self.stop.setObjectName("stop")
        self.horizontalLayout.addWidget(self.stop)

        # добавляем кнопку перезагрузки страницы
        self.reload = QtGui.QPushButton(HttpWidget)
        self.reload.setObjectName("reload")
        self.horizontalLayout.addWidget(self.reload)

        # добавляем адресную строку )))))
        self.url = QtGui.QLineEdit(HttpWidget)
        self.url.setObjectName("url")
        self.horizontalLayout.addWidget(self.url)
        self.verticalLayout.addLayout(self.horizontalLayout)

        # а вот и закрепление вебкита! =))
        self.webView = QtWebKit.QWebView(HttpWidget)
        self.webView.setUrl(QtCore.QUrl("about:blank"))
        self.webView.setObjectName("webView")
        self.verticalLayout.addWidget(self.webView)

        self.retranslateUi(HttpWidget)#запускаем перевод


    # определяем метод для перевода надписей
    def retranslateUi(self, HttpWidget):

        #translate() необходима дял возможно перевода текста
        HttpWidget.setWindowTitle(QtGui.QApplication.translate("HttpWidget", "Form", None, QtGui.QApplication.UnicodeUTF8))

        self.back.setToolTip(QtGui.QApplication.translate("HttpWidget", "Back", None, QtGui.QApplication.UnicodeUTF8))
        self.back.setText(QtGui.QApplication.translate("HttpWidget", "Back", None, QtGui.QApplication.UnicodeUTF8))
        self.next.setToolTip(QtGui.QApplication.translate("HttpWidget", "Next", None, QtGui.QApplication.UnicodeUTF8))
        self.next.setText(QtGui.QApplication.translate("HttpWidget", "Next", None, QtGui.QApplication.UnicodeUTF8))
        self.stop.setToolTip(QtGui.QApplication.translate("HttpWidget", "Stop", None, QtGui.QApplication.UnicodeUTF8))
        self.stop.setText(QtGui.QApplication.translate("HttpWidget", "Stop", None, QtGui.QApplication.UnicodeUTF8))
        self.reload.setToolTip(QtGui.QApplication.translate("HttpWidget", "Reload", None, QtGui.QApplication.UnicodeUTF8))
        self.reload.setText(QtGui.QApplication.translate("HttpWidget", "Reload", None, QtGui.QApplication.UnicodeUTF8))

во втором определим сигналы и подключим их к слотам - таким образом мы сможем управлять объектом QtWebKit.QWebView =

# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtCore, QtGui

from httpWidget import Ui_HttpWidget


from PyQt4 import QtWebKit


class httpWidget(QtGui.QWidget):
    # конструктор класса
  def __init__(self, parent=None):
    super(httpWidget, self).__init__(parent)

# привязываем атрибут ui - user interface
    self.ui = Ui_HttpWidget()
    self.ui.setupUi(self)
    self.ty = 12

  # устанавливаем отступы
    l = self.layout()
    l.setMargin(10)
    #добавляем слой и определяем отступы
    self.ui.horizontalLayout.setMargin(5)

    # "некоммерческий" яндекс
    url = '123' # 123 заменить на http://ya.ru
    self.ui.url.setText(url)

    # load page
    self.ui.webView.setUrl(QtCore.QUrl(url))

    # history buttons:
    self.ui.back.setEnabled(False)
    self.ui.next.setEnabled(False)

# секция подключения сигналов к слотам
    QtCore.QObject.connect(self.ui.back,QtCore.SIGNAL("clicked()"), self.back)
    QtCore.QObject.connect(self.ui.next,QtCore.SIGNAL("clicked()"), self.next)
    QtCore.QObject.connect(self.ui.url,QtCore.SIGNAL("returnPressed()"), self.url_changed)
    QtCore.QObject.connect(self.ui.webView,QtCore.SIGNAL("linkClicked (const QUrl&)"), self.link_clicked)
    QtCore.QObject.connect(self.ui.webView,QtCore.SIGNAL("urlChanged (const QUrl&)"), self.link_clicked)
    QtCore.QObject.connect(self.ui.webView,QtCore.SIGNAL("loadProgress (int)"), self.load_progress)
    QtCore.QObject.connect(self.ui.webView,QtCore.SIGNAL("titleChanged (const QString&)"), self.title_changed)
    QtCore.QObject.connect(self.ui.reload,QtCore.SIGNAL("clicked()"), self.reload_page)
    QtCore.QObject.connect(self.ui.stop,QtCore.SIGNAL("clicked()"), self.stop_page)


  def url_changed(self):
    """
    Url have been changed by user
    """
    page = self.ui.webView.page()
    history = page.history()
    if history.canGoBack(): # если есть "предыдущая" страница
	    self.ui.back.setEnabled(True)
    else:
	    self.ui.back.setEnabled(False)

    if history.canGoForward():# если есть "следующая" страница
	    self.ui.next.setEnabled(True)
    else:
	    self.ui.next.setEnabled(False)

    url = self.ui.url.text()
    self.ui.webView.setUrl(QtCore.QUrl(url))

  def stop_page(self):
    """
    останавливаем загрузку страницы
    """
    self.ui.webView.stop()

  def title_changed(self, title):
    """
    меняем заголовок окна в соответсвии с заголовком
    страницы
    """
    self.setWindowTitle(title)

  def reload_page(self):
    """
    перезагружаем страницу
    """
    self.ui.webView.setUrl(QtCore.QUrl(self.ui.url.text()))

  def link_clicked(self, url):
    """
    Если перешли по ссылке -
    то меняем адрес в адресной строке
    """
    page = self.ui.webView.page()
    history = page.history()
    if history.canGoBack():
	    self.ui.back.setEnabled(True)
    else:
	    self.ui.back.setEnabled(False)
    if history.canGoForward():
	    self.ui.next.setEnabled(True)
    else:
	    self.ui.next.setEnabled(False)

    self.ui.url.setText(url.toString())

  def load_progress(self, load):
    """
    Page load progress
    """
    if load == 100:
	    self.ui.stop.setEnabled(False)
    else:
	    self.ui.stop.setEnabled(True)

  def back(self):
    """
    Возвращаемся на преыдущую страницу
    если нажата кнопка "назад"
    """
    page = self.ui.webView.page()
    history = page.history()
    history.back()
    if history.canGoBack():
	    self.ui.back.setEnabled(True)
    else:
	    self.ui.back.setEnabled(False)

  def next(self):
    """
    переходим на следующую страницу
    если была нажат соотв. кнопка
    """
    page = self.ui.webView.page()
    history = page.history()
    history.forward()
    if history.canGoForward():
      self.ui.next.setEnabled(True)
    else:
      self.ui.next.setEnabled(False)

# точка входа в программу
if __name__ == "__main__":
  app = QtGui.QApplication(sys.argv)
  myapp = httpWidget()
  myapp.show()
  sys.exit(app.exec_())