Saltar al contenido

Cómo configurar datos dentro de un QAbstractTableModel

Solución:

La forma en que los datos reales se guardan en la memoria, se generan o se consultan desde un almacén de datos depende completamente de usted. Si se trata de datos estáticos, puede utilizar las clases de contenedor Qt o estructuras de datos personalizadas.

Solo necesita reimplementar el setData() método para modelos editables.

Hay 4 métodos que debe implementar de forma no editable. QAbstractTableModel subclase:

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole )
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

Estos métodos se llaman desde la vista, normalmente un QTableView ejemplo. Los dos primeros métodos deberían devolver las dimensiones de la tabla. Por ejemplo, si rowCount() devoluciones 10 y columnCount() devoluciones 4, la vista invocará el data() método 40 veces (una para cada celda) solicitando los datos reales en las estructuras de datos internas de su modelo.

Como ejemplo, suponga que ha implementado un espacio personalizado retrieveDataFromMarsCuriosity() en su modelo. Esta ranura llena una estructura de datos y está conectada a un QPushButton ejemplo, para obtener datos nuevos haciendo clic en un botón. Ahora, debe informar a la vista cuándo se están modificando los datos para que pueda actualizarse correctamente. Es por eso que necesitas emitir el beginRemoveRows(), endRemoveRows(), beginInsertRows(), endInsertRows() y sus contrapartes de columna.

La documentación de Qt tiene todo lo que necesita saber sobre esto.

No necesitas usar setData(...). En su lugar, necesita subclase QAbstractTableModel de tal manera que sus métodos rowCount(), columnCount(), data(index) y potencialmente headerData(section, horizontalOrVertical) devolver los datos que desea mostrar. Aquí hay un ejemplo basado en PyQt5:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

headers = ["Scientist name", "Birthdate", "Contribution"]
rows =    [("Newton", "1643-01-04", "Classical mechanics"),
           ("Einstein", "1879-03-14", "Relativity"),
           ("Darwin", "1809-02-12", "Evolution")]

class TableModel(QAbstractTableModel):
    def rowCount(self, parent):
        # How many rows are there?
        return len(rows)
    def columnCount(self, parent):
        # How many columns?
        return len(headers)
    def data(self, index, role):
        if role != Qt.DisplayRole:
            return QVariant()
        # What's the value of the cell at the given index?
        return rows[index.row()][index.column()]
    def headerData(self, section, orientation, role):
        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
            return QVariant()
        # What's the header for the given column?
        return headers[section]

app = QApplication([])
model = TableModel()
view = QTableView()
view.setModel(model)
view.show()
app.exec_()

Se toma de este repositorio de GitHub y muestra la siguiente tabla:

Ejemplo de QAbstractTableModel

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *