PyQT-5 Controles Para Visualizar Listas

Este tutorial trata sobre aquellos controles que nos permiten visualizar una lista de elementos y seleccionar o varios elementos de la lista, entre los más comunes tenemos: QComboBox, QListWidget, QTableVidget, veremos un ejemplo donde presentamos cada uno de estos widgets de la biblioteca pyqt-5.

Widget QComboBox


Este muestra sus elementos en una lista desplegable que se muestra cuando el usuario hace clic sobre él, podemos seleccionar un elemento de la lista, al hacerlo se lanza el evento currentTextChanged que nos indica que el texto seleccionado ha cambiado.

Agregamos elementos al QComboBox usando su método addItems(ítem_list) donde le pasamos la lista de elementos que deseamos mostrar, podemos agregar elementos uno a uno usando el método addItem(item), para seleccionar un elemento mediante programación contamos con setItemText(int, str) donde indicamos primero el índice del elemento que deseamos seleccionar, luego el texto a seleccionar.

cbx = QComboBox()
# agregar lista de nombres de estilos disponibles
cbx.addItems(QStyleFactory.keys())
# responder al evento cambio de texto
cbx.currentTextChanged.connect(self.textChanged)
# seleccionar el ultimo elemento
cbx.setItemText(4, 'Fusion')

QComboBox pyqt-5

Widget QListWidget


Este control es bastante similar al anterior salvo que la lista siempre está visible, podemos decir que un QComboBox usa un QListWidget para mostrar su lista de elementos, manejamos el evento itemSelectionChanged para saber cuándo se ha seleccionado un nuevo elemento, si deseamos saber cuál es el elemento actualmente seleccionado usamos en método currentItem() que devuelve el objeto QListWidgetItem que representa dicho elemento, usamos el método QListWidgetItem.text() para obtener el texto mostrado.

# lista de elementos
    items = ['Ubuntu', 'Linux', 'Mac OS', 'Windows', 'Fedora', 'Chrome OS', 'Android', 'Windows Phone']

    self.lv = QListWidget()
    self.lv.addItems(items)
    self.lv.itemSelectionChanged.connect(self.itemChanged)

def itemChanged(self):
    item = QListWidgetItem(self.lv.currentItem())
    print("Sistema seleccionado: ", item.text())

QListWidget pyqt-5

Widget QTableWidget


Este control nos permite presentar la información en formato tabular, en filas, columnas y celdas, para establecer los nombres de cabecera de las columnas usaremos el método setHorizontalHeaderLabels(['Nombre', 'Edad', 'Nacionalidad']) pasándole en orden cada uno de los nombres para las columnas.

Para agregar elementos a este control usamos su método setItem() indicándole primero, el índice de la fila a la que pertenece, segundo, el índice de la columna y por último el dato a mostrar.

table = QTableWidget(10, 3)
table.setHorizontalHeaderLabels(['Nombre', 'Edad', 'Nacionalidad'])

table_data = [
    ("Alice", 15, "Panama"),
    ("Dana", 25, "Chile"),
    ("Fernada", 18, "Ecuador")
]

# agregar cada uno de los elementos al QTableWidget
for i, (name, age, city) in enumerate(table_data):
    table.setItem(i, 0, QTableWidgetItem(name))
    table.setItem(i, 1, QTableWidgetItem(str(age)))
    table.setItem(i, 2, QTableWidgetItem(city))

QTableWidget pyqt-5

Obtener Elemento Seleccionado de QTableWidget


Al igual que el control anterior manejamos en evento itemSelectionChanged que se produce cada vez que se selecciona un elemento, para nuestro ejemplo cambiamos en comportamiento del control en cuanto a la selecciona de elementos indicando que solo deseamos seleccionar filas, usando el método: setSelectionBehavior(QTableWidget.SelectRows), el comportamiento por defecto permite la selección de filas (SelectRows), columnas (SelectColumns) o celdas individualmente (SelectItems), usamos también setSelectionMode(QTableWidget.SingleSelection) para indicar que solo permitiremos la selección de un elemento a la vez, por defecto es posible seleccionar varios elementos.

# seleccionar solo filas
self.table.setSelectionBehavior(QTableWidget.SelectRows)
# usar seleccion simple, una fila a la vez
self.table.setSelectionMode(QTableWidget.SingleSelection)
# evento producido cuando cambia el elemento seleccionado
self.table.itemSelectionChanged.connect(self.tableItemChanged)

Para obtener el elemento seleccionado usamos el método self.table.selectedItems() como solo seleccionamos filas, una a la vez, este método nos devuelve los elementos que componen la fila, si la seleccionar fuera la celda individual nos devolvería el valor de dicha celda, si la selección fuera una columna nos devolvería los datos de la columna.

def tableItemChanged(self):
    name, age, city = self.table.selectedItems()
    print("Data:", name.text(), age.text(), city.text())

Con esto cada vez que se selecciona una fila obtenemos: el nombre, la edad y el país al que pertenece cada persona.

GitHub: Controles Tipo Lista PyQT-5

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

Controles y Contenedores JavaFX 8 - I

Histogramas OpenCV Python