PyQt - Umsetzung eines QAbstractTableModel zur Anzeige in QTableView
Ich würde gerne die Anzeige eines pandas-Daten-frame in eine PyQt-Tabelle. Ich habe einige Fortschritte gemacht, aber nicht in der Lage, richtig abzuleiten, die Tabelle Model-Klasse. Jede Hilfe bei diesem würde sehr geschätzt.
** Hinweis: die vollständige Beispiel-code hier **
Ich bin kämpfen, erzeugen Sie ein gültige QtCore.QAbstractTableModel abgeleiteten Klasse. Nach einer vorherigen Frage über QItemDelegates ich versuche zu generieren, eine Tabelle, Modell von ein Pandas DataFrame einfügen realen Daten. Ich habe Beispiel-code hier, aber wenn ich ersetzen mein TableModel mit TableModel2 in der Widget-Klasse (ln 152) kann ich nicht bekommen, die Tabelle anzuzeigen.
class TableModel2(QtCore.QAbstractTableModel):
def __init__(self, parent=None, *args):
super(TableModel2, self).__init__()
#QtCore.QAbstractTableModel.__init__(self, parent, *args)
self.datatable = None
self.headerdata = None
self.dataFrame = None
self.model = QtGui.QStandardItemModel(self)
def update(self, dataIn):
print 'Updating Model'
self.datatable = dataIn
print 'Datatable : {0}'.format(self.datatable)
headers = dataIn.columns.values
header_items = [
str(field)
for field in headers
]
self.headerdata = header_items
print 'Headers'
print self.headerdata
for i in range(len(dataIn.index.values)):
for j in range(len(dataIn.columns.values)):
#self.datatable.setItem(i,j,QtGui.QTableWidgetItem(str(df.iget_value(i, j))))
self.model.setItem(i,j,QtGui.QStandardItem(str(dataIn.iget_value(i, j))))
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.datatable.index)
def columnCount(self, parent=QtCore.QModelIndex()):
return len(self.datatable.columns.values)
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return QtCore.QVariant()
elif role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
#return QtCore.QVariant(self.model.data(index))
return QtCore.QVariant(self.model.data(index))
def headerData(self, col, orientation, role):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return QtCore.QVariant()
return QtCore.QVariant(self.headerdata[col])
def setData(self, index, value, role=QtCore.Qt.DisplayRole):
print "setData", index.row(), index.column(), value
def flags(self, index):
if (index.column() == 0):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled
else:
return QtCore.Qt.ItemIsEnabled
Ich bin versucht, das Modell zu erstellen und dann fügen Sie Sie der Ansicht, wie diese:
class Widget(QtGui.QWidget):
"""
A simple test widget to contain and own the model and table.
"""
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
l=QtGui.QVBoxLayout(self)
cdf = self.get_data_frame()
self._tm=TableModel(self)
self._tm.update(cdf)
self._tv=TableView(self)
self._tv.setModel(self._tm)
for row in range(0, self._tm.rowCount()):
self._tv.openPersistentEditor(self._tm.index(row, 0))
l.addWidget(self._tv)
def get_data_frame(self):
df = pd.DataFrame({'Name':['a','b','c','d'],
'First':[2.3,5.4,3.1,7.7], 'Last':[23.4,11.2,65.3,88.8], 'Class':[1,1,2,1], 'Valid':[True, True, True, False]})
return df
Vielen Dank für Ihre Aufmerksamkeit!
Hinweis : Edit 2
Ich wurde die QStandardItemModel in TableModel2. Ebenfalls gelöscht werden die dataFrameToQtTable Funktion nach @mata ' s Kommentar. Dies ist immer ein bisschen näher, aber immer noch nicht funktioniert.
InformationsquelleAutor drexiya | 2013-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe dieses herausgefunden, mit der oben genannten suggestion und etwas Hilfe von den Rapid-GUI-Buch von Summerfield. Es gibt keine zugrunde liegende Modell, das es in der QAbstractTableModel. Nur drei Funktionen müssen überschrieben werden, und die Daten können gespeichert werden, in irgendeiner benutzerdefiniertes format, so lange, wie es zurückgegeben wird, in der Daten nennen.
Einer sehr einfachen Umsetzung könnte sein:
Dies ermöglicht Ihnen das anzeigen alle kompatiblen Daten-frame in einer Qt-Ansicht.
Habe ich aktualisiert, das Wesentliche über hier
Das sollte erhalten Sie gehen schnell, wenn Sie auch brauchen, um dies zu tun.
InformationsquelleAutor drexiya
Dies ist wohl das problem:
Legen Sie Ihre
datatable
zu einemQTableWidget
imdataFrameToQtTable
kann es also nicht seinpd.DataFrame
, Ihre Methoden werden immer 0 zurück.Ohne die Art zu überprüfen, Sie würde gefangen haben das problem sofort. Wollen Sie wirklich, um schweigend ignorieren Sie alle Fälle, in denen Sie Ihre Art passt nicht (besser lassen Sie es zu einem Fehler, wenn Sie nicht Folgen Sie die gleiche Schnittstelle, die Sie erwarten sind)? Typechecks sind in den meisten Fällen unnötig.
Ich habe vereinfachte Beispiel-code, um diese zu entfernen dataFrameToQtTable hoffentlich das problem ist klar.
InformationsquelleAutor mata
Pandas 0.13 stellt als experimentelles feature:
PySide Unterstützung für die qtpandas
DataFrameModel
undDataFrameWidget
sehen https://github.com/pydata/pandas/blob/master/doc/source/faq.rst
können Sie dieses feature verwenden
InformationsquelleAutor working4coins