import sys from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal, QAbstractTableModel, QModelIndex from PyQt5.QtCore import QVariant import util import PyQt5.QtCore as QtCore class PandasModel(QtCore.QAbstractTableModel): """ Class to populate a table view with a pandas dataframe """ def __init__(self, data, parent=None): super().__init__(parent) self._data = data self._roleNames = {} def __len__(self): return len(self._data) def __str__(self): return str(self._data) def rowCount(self, parent=None): return len(self._data.values) def columnCount(self, parent=None): return self._data.columns.size def data(self, index, role=QtCore.Qt.DisplayRole): if index.isValid(): if(role==QtCore.Qt.DisplayRole): return self._data.values[index.row()][index.column()] else: # self._roleName 은 QHash(int, QByteArray) columnName = self._roleNames[role].data().decode('utf8') print('row {} col {} role {} columnName {} '.format(index.row(), index.column(), role, columnName)) print(self._data.at[index.row(), columnName]) return self._data.at[index.row(), columnName] return QVariant() def headerData(self, col, orientation, role): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return self._data.columns[col] return None # return 값은 QHash(int, QByteArray) def roleNames(self): for index, name in enumerate(self._data.columns): self._roleNames[ QtCore.Qt.UserRole + index + 1] = QtCore.QByteArray(name.encode()) return self._roleNames def refresh(self): leftTopIndex = self.index(0, 0) print("%s row count %s col count %s" % ( util.whoami(), self.rowCount(), self.columnCount() )) rightBottomIndex = self.index(self.rowCount(), self.columnCount()) self.dataChanged.emit(leftTopIndex, rightBottomIndex) def _dataFrame(self): return self._data if __name__ == '__main__': # pandas model test import pandas as pd df = pd.DataFrame(columns=('code', 'name')) model = PandasModel(df) print(model.headerData(0, QtCore.Qt.Horizontal, QtCore.Qt.DisplayRole)) print("%s %s" % (id(df), id(model._dataFrame()))) print("before append model length %s" %(len(model))) df.loc[len(df)] = ['1', '1111'] df.loc[len(df)] = ['2', '2222'] df.loc[len(df)] = ['3', '3333'] df.loc[len(df)] = ['4', '4444'] index = model.index(0, 0) # print("0 row 0 col data is %s" % (model.data(index))) model.refresh() print("after append model length %s" %(len(model))) print("model list is \n %s " % model) print("model roleNames %s" % model.roleNames()) # pandas model and qml operation test from PyQt5.QtQml import QQmlApplicationEngine from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QUrl myApp = QApplication(sys.argv) qmlEngine = QQmlApplicationEngine() rootContext = qmlEngine.rootContext() rootContext.setContextProperty("cppModelCondition", model) qmlEngine.load(QUrl('main.qml')) sys.exit(myApp.exec_()) # input()