在QML中显示pandas数据帧

问题描述 投票:1回答:1

我有2个pandas dataframes,一个有6 rows7 columns,另一个有21 rows12 columns,我想用QML显示它们,而googling我了解了TableView TableView QML Type。在该示例中,数据已经在ListElement中输入并且正在显示。但在我的情况下,数据来自python pandas数据帧,如何在pazxswpoi之前创建那些列,我怎样才能将pandas中的列和行直接读取到QML中?任何帮助,将不胜感激

注意:我使用listelement来显示数据帧,它只是一个拖放表视图,并使用创建的模型并使用QtWidgets设置它们。但我在QML中有点无能为力

python pandas pyqt qml pyqt5
1个回答
1
投票

您可以创建一个继承自tableView.setModel(model)中的QAbstractTableModel的类,并使用Qt 5.12中发布的qtxswpoi,因为它支持this old answer类型模型,因此您必须使用最新版本的PyQt5。

卖弄.朋友

QTableView

main.qml

QAbstractTableModel

from PyQt5 import QtCore, QtGui, QtQml import numpy as np import pandas as pd class DataFrameModel(QtCore.QAbstractTableModel): DtypeRole = QtCore.Qt.UserRole + 1000 ValueRole = QtCore.Qt.UserRole + 1001 def __init__(self, df=pd.DataFrame(), parent=None): super(DataFrameModel, self).__init__(parent) self._dataframe = df def setDataFrame(self, dataframe): self.beginResetModel() self._dataframe = dataframe.copy() self.endResetModel() def dataFrame(self): return self._dataframe dataFrame = QtCore.pyqtProperty(pd.DataFrame, fget=dataFrame, fset=setDataFrame) @QtCore.pyqtSlot(int, QtCore.Qt.Orientation, result=str) def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int = QtCore.Qt.DisplayRole): if role == QtCore.Qt.DisplayRole: if orientation == QtCore.Qt.Horizontal: return self._dataframe.columns[section] else: return str(self._dataframe.index[section]) return QtCore.QVariant() def rowCount(self, parent=QtCore.QModelIndex()): if parent.isValid(): return 0 return len(self._dataframe.index) def columnCount(self, parent=QtCore.QModelIndex()): if parent.isValid(): return 0 return self._dataframe.columns.size def data(self, index, role=QtCore.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < self.rowCount() \ and 0 <= index.column() < self.columnCount()): return QtCore.QVariant() row = self._dataframe.index[index.row()] col = self._dataframe.columns[index.column()] dt = self._dataframe[col].dtype val = self._dataframe.iloc[row][col] if role == QtCore.Qt.DisplayRole: return str(val) elif role == DataFrameModel.ValueRole: return val if role == DataFrameModel.DtypeRole: return dt return QtCore.QVariant() def roleNames(self): roles = { QtCore.Qt.DisplayRole: b'display', DataFrameModel.DtypeRole: b'dtype', DataFrameModel.ValueRole: b'value' } return roles if __name__ == "__main__": import os import sys app = QtGui.QGuiApplication(sys.argv) df = pd.DataFrame(np.random.randint(0, 100, size=(6, 7)), columns=list('ABCDEFG')) print(df) model = DataFrameModel(df) engine = QtQml.QQmlApplicationEngine() engine.rootContext().setContextProperty("table_model", model) qml_path = os.path.join(os.path.dirname(__file__), "main.qml") engine.load(QtCore.QUrl.fromLocalFile(qml_path)) if not engine.rootObjects(): sys.exit(-1) engine.quit.connect(app.quit) sys.exit(app.exec_())

我用过:

  • Python 3.7.2
  • PyQt5 5.12.1
  • Qt 5.12.2
  • 大熊猫0.24.1
© www.soinside.com 2019 - 2024. All rights reserved.