使用列表与QTableView结合时触发类型错误
问题解决:QTableView无法直接接收列表数据
错误原因
QTableView的构造函数仅接受可选的父控件参数,不能直接传入数据列表——这就是触发TypeError的核心原因。Qt的表格组件遵循"视图-模型"架构,必须通过数据模型绑定数据源,不能直接把列表传给QTableView。
修复步骤
使用QStandardItemModel作为中间数据模型,将列表数据填充到模型后,再绑定到QTableView上。修改FeedexWindow类的代码如下:
from PySide6.QtWidgets import QWidget, QMainWindow, QPushButton, QTableView, QHBoxLayout, QStandardItemModel, QStandardItem from datetime import datetime class FeedexWindow(QMainWindow): def __init__(self, data): super().__init__() self.setWindowTitle(f"FeeDex {__version__}") save_button = QPushButton("Save") save_button.clicked.connect(self.click_print) # 1. 创建数据模型并设置表头 subs_model = QStandardItemModel() subs_model.setHorizontalHeaderLabels(["系列标题", "章节信息", "更新时间"]) # 2. 遍历数据填充模型 for row_data in data: items = [] for col_data in row_data: # 处理datetime对象,转为可读字符串 if isinstance(col_data, datetime): item_text = col_data.strftime('%Y-%m-%d %H:%M:%S') else: item_text = str(col_data) items.append(QStandardItem(item_text)) subs_model.appendRow(items) # 3. 创建表格并绑定模型 subs_table = QTableView() subs_table.setModel(subs_model) # 可选:让列宽自适应内容 subs_table.resizeColumnsToContents() parent_layout = QHBoxLayout() parent_layout.addWidget(subs_table) parent_layout.addWidget(save_button) main_widget = QWidget() main_widget.setLayout(parent_layout) self.setCentralWidget(main_widget) def click_print(self): # 补充按钮点击方法的基础实现,避免运行报错 print("保存按钮已点击")
关键说明
- QTableView是视图组件,仅负责数据展示;数据实际存储在模型组件(如QStandardItemModel)中,两者通过
setModel()方法完成绑定。 - datetime类型无法直接被QStandardItem识别,必须转为字符串格式后再添加到模型。
- 如果需要更复杂的交互(如数据编辑、自定义排序),可以自定义
QAbstractTableModel子类,QStandardItemModel足以满足基础表格展示需求。
内容的提问来源于stack exchange,提问作者DorderaDomo
相关产品推荐
相关产品推荐

