You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QTableView中展示自定义类内部生成的pandas DataFrame

PyQt5 QTableView显示Pandas DataFrame问题修复

核心问题点

  • 类设计逻辑混乱:声明了多继承但未正确初始化父类,同时混淆了继承和组合的用法,metodos_se的构造函数需要两个必填参数,你未传入也未初始化
  • 核心属性未生成:存储表格数据的tab属性仅在_aoki_velloso方法中定义,你全程未调用该方法,访问该属性时直接触发异常闪退
  • Qt虚函数名不匹配:表头渲染的官方虚函数为驼峰命名的headerData,你写成了下划线分隔的header_data,Qt无法识别不会触发调用
  • 非法属性访问:metodos_se的controle方法直接访问_fluxo参数内的btn控件,你传入的是空列表,不存在对应属性直接报错
  • 未开启异常捕获:PyQt默认会静默吞掉异常直接闪退,看不到报错信息

修复后可运行代码

采用更简单的组合模式实现,去掉示例中不存在的外部控件依赖,运行后可直接展示符合预期的4行13列表格:

import numpy as np
import pandas as pd
from PyQt5.QtCore import QObject, QAbstractTableModel, Qt
from PyQt5.QtWidgets import QTableView, QApplication
import sys

# 开启异常捕获,闪退时会打印详细报错信息
import cgitb
cgitb.enable(format='text')


class metodos_se(QObject):
    fs: float = 2

    def __init__(self):
        super().__init__()
        # 示例阶段暂时注释依赖外部控件的逻辑,后续接入真实界面可恢复
        # self.dados = _dados
        # self.fluxo = _fluxo
        # self.controle()
        # 初始化直接生成DataFrame
        self._aoki_velloso()

    # 示例阶段暂时注释依赖外部控件的逻辑
    # def controle(self):
    #     self.fluxo[0].btn.clicked.connect(self.fluxo[0].close)

    def _aoki_velloso(self):
        # 示例阶段暂时注释依赖外部控件的逻辑
        # self.num_son = int(self.fluxo[0].num_son.text())

        pd.set_option('display.max_rows', 4)
        self.tab = pd.DataFrame(index=(0, 1, 2, 3),
                           columns=['Prof_m', 'Nspt', 'F1', 'K_kN/cm²',
                           'Ap_cm²', 'Pp_kN', 'F2', 'K_kN/cm²', 'α',
                           'Perim_cm', 'Pl, unit._kN', 'Pl, acum._kN', 'Pr_kN'])
        self.tab['Prof_m'] = (0, 1, 2, 4)
        self.tab['Nspt'] = (1, 2, 3, 4)
        self.tab['Nspt'] = self.tab['Nspt'].apply(lambda x: x + 1)


class result_tab(QAbstractTableModel):
    # 改为组合模式,直接传入metodos_se实例
    def __init__(self, metodos_inst):
        super().__init__()
        self.metodos_se = metodos_inst

    def rowCount(self, parent=None):
        return self.metodos_se.tab.shape[0]

    def columnCount(self, parent=None):
        return self.metodos_se.tab.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self.metodos_se.tab.iloc[index.row(), index.column()])
        return None

    # 修正方法名为Qt要求的驼峰命名
    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.metodos_se.tab.columns[col]
        return None


if __name__ ==  '__main__':
    app = QApplication(sys.argv)
    # 先实例化metodos_se生成DataFrame
    metodos_inst = metodos_se()
    # 传入实例初始化表格模型
    model = result_tab(metodos_inst)
    view = QTableView()
    view.setModel(model)
    view.resize(800, 600)
    view.show()
    sys.exit(app.exec_())

内容的提问来源于stack exchange,提问作者zeca_abc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:07