Editar tabla en pyqt usando QAbstractTableModel

Estoy tratando de crear una tabla editable en PyQt. Aquí está el código para simplemente mostrar la tabla:

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

# données à représenter
my_array = [['00','01','02'],
            ['10','11','12'],
            ['20','21','22']]

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

# création de la vue et du conteneur
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel = MyTableModel(my_array, self)
        tableview = QTableView()
        tableview.setModel(tablemodel)

        layout = QVBoxLayout(self)
        layout.addWidget(tableview)
        self.setLayout(layout)

# création du modèle
class MyTableModel(QAbstractTableModel):
    def __init__(self, datain, parent = None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.arraydata = datain

    def rowCount(self, parent):
        return len(self.arraydata)

    def columnCount(self, parent):
        return len(self.arraydata[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return (self.arraydata[index.row()][index.column()])

    """
    def setData(self, index, value):
        self.arraydata[index.row()][index.column()] = value
        return True
    def flags(self, index):
        return Qt.ItemIsEditable
    """    

if __name__ == "__main__":
    main()

Si implemento el método setData y flags, todos los elementos ni siquiera son seleccionables... ¿Cuál es la solución para hacer que la tabla sea editable? Gracias

preguntado el 31 de julio de 12 a las 10:07

2 Respuestas

Acabo de encontrar la solución, en los métodos de banderas necesito devolver el valor QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

Respondido 31 Jul 12, 10:07

Esto funciona. También puede O las banderas ya existentes con el ItemIsEditable bandera: QtCore.QAbstractTableModel.flags(self, index) | QtCore.Qt.ItemIsEditable - Eric

Probé tu código. Para trabajar necesitaba cambiar def setData(auto, índice, valor) a def setData(auto, índice, valor, rol) - David Miro

OR Override
Qt::ItemFlags MyTableView::flags(const QModelIndex& index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    flags |= Qt::ItemIsEditable;
    return flags;
}

contestado el 22 de mayo de 15 a las 23:05

@bigOTHER Sin mencionar que este código está en C++ mientras que la pregunta es sobre Python. - 2mac

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.