En este capítulo del tutorial de Python 3 más PyQt5 veremos lo útil que es trabajar con objetos de la clase QTabWidget, para ello nos basaremos en crear un navegador con las herramientas de WebKit y apoyándonos en un Tab Widget para ir agregando o eliminando páginas de navegación mediante los conocidos tabs o pestañas.
Más información de la clase QTabWidget: http://pyqt.sourceforge.net/Docs/PyQt4/qtabwidget.html#currentIndex-prop
Crearemos un archivo ui con Designer en una ventana principal (Main Window) al cual agregaremos:
- Un objeto Tab Widget con nombre tabWidget que es el que viene por defecto.
- Un objeto Push Button con nombre btn_mas y como texto el signo "+" para agregar páginas.
- Un objeto Push Button con nombre btn_menos y como texto el signo "-" para eliminar páginas.
- Un objeto Line Edit con nombre url para la navegación.
- Agrupar los elementos en un Lay Out in a Grid.
- Guardar el archivo como webkit-tab.ui
webkit-tab.pyw
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QUrl
from PyQt5.QtWebKitWidgets import QWebView
from PyQt5 import uic
class Navegador(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("webkit-tab.ui", self)
self.pages = [] #array donde se guardará cada página objeto
self.index = 0 #Al crear o eliminar tabs incrementar o disminuir el index
self.add_tab() #Crear un tab por defecto
#Agregar un nuevo tab con página
self.btn_mas.clicked.connect(self.add_tab)
#Eliminar un tab
self.btn_menos.clicked.connect(self.remove_tab)
#Cargar información de la página activa al terminar de cargarla
self.pages[self.tabWidget.currentIndex()].loadFinished.connect(self.getInfo)
#Actualizar información de la página del tab activo
self.tabWidget.currentChanged.connect(self.current_changed)
#Buscar la url indicada por el usuario
self.url.returnPressed.connect(self.search)
#Agregar un nuevo tab con página
def add_tab(self):
#Comprobar el número de páginas/tabs e incrementar en 1 para el index del nuevo elemento
if len(self.pages) > 0:
for i in range(len(self.pages)):
self.index = i + 1
#Crear objeto página
pagina = QWebView()
#Agregar objeto página al array pages
self.pages.append(pagina)
#Cargar la url por defecto
self.pages[self.index].load(QUrl("http://www.google.com"))
#Agregar el objeto página a un nuevo tab
self.tabWidget.addTab(self.pages[self.index], "")
#Poner el foco en el nuevo tab
self.tabWidget.setCurrentIndex(self.index)
def getInfo(self):
#Index del tab que tiene el foco
index = self.tabWidget.currentIndex()
#Título de la página web
title = self.pages[index].title()
#Agregar título al tab
self.tabWidget.setTabText(index, title)
#Agregar título a la ventana
self.setWindowTitle(title)
#Actualizar la url del buscador
url = self.pages[index].url()
self.url.setText(url.toString())
def current_changed(self):
#Index del tab que tiene el foco
index = self.tabWidget.currentIndex()
#Actualizar la información de la página si un tab obtiene el foco
self.pages[index].loadFinished.connect(self.getInfo)
#Título de la página web
title = self.pages[index].title()
#Agregar título al tab
self.tabWidget.setTabText(index, title)
#Agregar título a la ventana
self.setWindowTitle(title)
#Actualizar la url del buscador
url = self.pages[index].url()
self.url.setText(url.toString())
def search(self):
#Url del campo de búsqueda
url = QUrl(self.url.text())
#Obtener el index del tab que tiene el foco
index = self.tabWidget.currentIndex()
#Navegar a la url
self.pages[index].setUrl(url)
def remove_tab(self):
#Obtener el index del tab que tiene el foco
index = self.tabWidget.currentIndex()
#Eliminar el tab
self.tabWidget.removeTab(index)
#Eliminar la página objeto del array pages
self.pages.pop(index)
#Actualizar el valor del atributo index
if self.index > 0: self.index = self.index - 1
#Actualizar la información del tab que obtendrá el foco tras la eliminación del seleccionado
self.current_changed()
app = QApplication(sys.argv)
navegador = Navegador()
navegador.show()
app.exec_()

No hay comentarios:
Publicar un comentario