Tôi muốn hiển thị khung dữ liệu gấu trúc trong bảng PyQt. Tôi đã thực hiện một số tiến bộ với điều này, nhưng đã không thể có được một cách chính xác lấy được các lớp mô hình bảng. Đánh giá rất cao mọi sự giúp đỡ trong trường hợp này.PyQt - Triển khai QAbstractTableModel để hiển thị trong QTableView
** Lưu ý đầy đủ mã ví dụ here **
Tôi đang nỗ lực để tạo ra một QtCore.QAbstractTableModel hợp lệ lớp dẫn xuất. Tiếp theo từ một câu hỏi trước về QItemDelegates Tôi đang cố gắng tạo ra một mô hình bảng từ một khung dữ liệu Pandas để chèn dữ liệu thực. Tôi có mã ví dụ làm việc here, nhưng nếu tôi thay thế TableModel bằng TableModel2 trong lớp Widget (ln 152), tôi không thể hiển thị bảng.
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
Tôi đang cố gắng để tạo ra các mô hình và sau đó thêm nó vào xem, như thế này:
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
Cám ơn sự quan tâm của bạn!
Lưu ý: Chỉnh sửa 2 Tôi đã kết hợp QStandardItemModel vào TableModel2. Cũng đã xóa hàm dataFrameToQtTable sau nhận xét của @ mata. Điều này đang tiến gần hơn một chút nhưng vẫn không hoạt động.
Pandas có một bảng ví dụ Qt trong repo của nó . https://github.com/pydata/pandas/commits/master/pandas/sandbox/qtpandas.py –