QTableView是显示表格状的视图


 

其经常使用的函数有
1.显示格子 setShowGrid(false);
2.由内容调整列 resizeColumnsToContents();
3.获取垂直表头 verticalHeader();

当然还有水平表头
4.设置非编辑状态
verticalView->setEditTriggers(QTableView::NoEditTriggers);
5.设置点击行为
verticalView->setSelectionBehavior(QTableView::SelectRows);
6.模型对象
 QStandardItemModel *model = new QStandardItemModel;
 model->setColumnCount(4);
 model->setHeaderData(0,Qt::Horizontal,tr("File"));
 model->setHeaderData(1,Qt::Horizontal,tr("Path"));
 model->setHeaderData(2,Qt::Horizontal,tr("Size"));
 model->setHeaderData(3,Qt::Horizontal,tr("Duration"));
设置显示模型为4列
7.增加项到模型
  QStandardItem* item1 = new QStandardItem(tr("Yesterday Once More.mid"));
 QStandardItem* item2 = new QStandardItem(tr("C://Mid//"));
 QStandardItem* item3 = new QStandardItem(tr("0.001M"));
 QStandardItem* item4 = new QStandardItem(tr("3:48"));
 QList<QStandardItem*> item;
 item << item1 << item2 << item3 << item4;
 model->appendRow(item);
8.设置模型到View
setModel(model);


如果要隐藏某一列或行, 必须在setModel之后. 至于resizeColumnToContents是在隐藏之后调用还是在隐藏之前调用, 并不影响显示的效果.很简单的控制QTableView的列大小:初始化QTableView:    ui->tableView->horizontalHeader()->setDefaultSectionSize(110);    ui->tableView->horizontalHeader()->setMinimumSectionSize(110);在setModel(model);后调用ui->tableView->resizeColumnsToContents(); 这样会省很多事, 也简单美观.


<think>好的,用户现在的问题是“怎么用QTableView和QAbstractTableModel显示表格数据”,我需要详细解释步骤和代码实现。首先,我应该回顾模型-视图架构的基本概念,然后分步骤讲解如何创建自定义模型、配置视图,以及如何填充数据。 首先,用户需要了解QAbstractTableModel的作用,它是数据的抽象表示,视图通过它获取数据。需要重写rowCount、columnCount和data这三个基本方法。可能还要处理标题,所以headerData方法也很重要。 接下来,需要创建一个自定义模型类,继承自QAbstractTableModel。在模型中,数据通常存储在一个列表或类似的结构中,比如二维列表,每一行是一个子列表,对应表格的一行数据。 然后,配置QTableView,将模型设置给视图,这样视图就能显示模型中的数据了。可能需要调整视图的一些属性,比如列宽、标题显示等。 另外,用户可能需要动态添加数据,所以模型中需要实现添加行的方法,比如add_row,这时候需要使用beginInsertRows和endInsertRows来通知视图数据变化,确保视图更新。 可能还需要考虑数据的角色(Role),比如DisplayRole用于显示,EditRole用于编辑时的数据。但用户的问题主要是显示,所以可能先聚焦在DisplayRole。 然后,示例代码部分需要清晰,展示模型类的实现,视图的设置,以及如何添加数据。可能还需要一个主窗口类来整合这些组件。 还要注意用户可能的疑问,比如如何处理不同的列类型,或者如何更新现有数据。但当前问题主要是显示,所以先覆盖基础部分。 最后,确保相关问题能引导用户进一步思考,比如模型的扩展、数据更新、委托的使用等。 </think>使用`QTableView`和`QAbstractTableModel`显示表格数据需遵循**模型-视图架构**,核心步骤为:**自定义模型类**(管理数据)、**配置视图**(关联模型)、**填充数据**(通过模型接口动态更新)。以下是完整实现流程和代码示例: ### 一、核心概念说明 - **QAbstractTableModel**:抽象基类,定义了表格模型的接口(如行数、列数、数据获取),需子类化并重写关键方法。 - **QTableView**:视图组件,通过模型的接口(如`rowCount()`、`data()`)获取数据并显示,与模型解耦。 ### 二、实现步骤与代码示例 #### 1. 自定义模型类(继承QAbstractTableModel) 模型类需重写以下核心方法,以提供视图所需的表格数据: - `rowCount()`:返回表格行数。 - `columnCount()`:返回表格列数。 - `data()`:返回指定位置(行、列)的数据(根据显示角色,如`Qt.DisplayRole`)。 - `headerData()`(可选):返回列/行标题。 ```python from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt class TableModel(QAbstractTableModel): def __init__(self, data=None, headers=None, parent=None): super().__init__(parent) # 初始化数据(二维列表:每行是一个列表,对应表格的一行数据) self._data = data if data else [] # 列标题(列表,如["姓名", "年龄", "性别"]) self._headers = headers if headers else [] def rowCount(self, parent=QModelIndex()): """返回行数(必须重写)""" return len(self._data) def columnCount(self, parent=QModelIndex()): """返回列数(必须重写)""" return len(self._headers) if self._data else 0 def data(self, index, role=Qt.DisplayRole): """返回指定位置的数据(必须重写)""" if not index.isValid() or role != Qt.DisplayRole: return None # 仅处理显示角色(DisplayRole) row = index.row() col = index.column() if row >= len(self._data) or col >= len(self._headers): return None return self._data[row][col] # 返回第row行第col列的数据 def headerData(self, section, orientation, role=Qt.DisplayRole): """返回列标题(可选重写)""" if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self._headers[section] if section < len(self._headers) else None return None # 垂直标题(行号)默认使用行索引,无需额外处理 def add_row(self, row_data): """动态添加一行数据(触发视图更新)""" # 通知视图:开始插入行(参数:父索引、插入位置起始行、结束行) self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self._data.append(row_data) # 实际添加数据到模型 self.endInsertRows() # 通知视图:插入完成 def update_data(self, row, col, new_value): """更新指定位置的数据(触发视图刷新)""" if 0 <= row < len(self._data) and 0 <= col < len(self._headers): self._data[row][col] = new_value # 通知视图:指定位置数据已修改(参数:起始索引、结束索引) self.dataChanged.emit(self.index(row, col), self.index(row, col)) ``` #### 2. 配置QTableView并关联模型 在主窗口中初始化`QTableView`,创建模型实例并通过`setModel()`关联视图: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QVBoxLayout class MainWindow(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 设置窗口基本属性 self.setWindowTitle("QTableView示例") self.setGeometry(100, 100, 800, 600) # 创建中心部件和布局 central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) # 初始化QTableView self.table_view = QTableView() layout.addWidget(self.table_view) # 创建模型并设置数据(示例数据) headers = ["姓名", "年龄", "性别"] # 列标题 data = [ ["张三", "25", "男"], ["李四", "30", "女"], ["王五", "28", "男"] ] self.model = TableModel(data, headers) # 关联模型与视图 self.table_view.setModel(self.model) # 可选:调整列宽(自动拉伸最后一列) self.table_view.horizontalHeader().setStretchLastSection(True) ``` #### 3. 动态添加/更新数据(示例) 通过模型的`add_row()`和`update_data()`方法修改数据,视图会自动刷新: ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() # 动态添加一行数据 window.model.add_row(["赵六", "22", "女"]) # 更新第二行(索引1)第一列(索引0)的数据为"李思思" window.model.update_data(1, 0, "李思思") window.show() app.exec_() ``` ### 三、关键细节说明 1. **数据角色(Role)**: `data()`方法的`role`参数决定数据的用途(如`Qt.DisplayRole`用于显示,`Qt.EditRole`用于编辑时的临时数据)。若需支持编辑,需重写`setData()`方法并处理`Qt.EditRole`。 2. **视图刷新**: 模型修改数据后(如添加行、更新值),需通过`beginInsertRows`/`endInsertRows`或`dataChanged`信号通知视图,否则视图不会自动刷新。 3. **自定义渲染**: 若需显示复杂内容(如按钮、图标),需通过**委托(Delegate)**自定义绘制逻辑(继承`QStyledItemDelegate`并重写`paint()`方法)。 ### 四、效果演示 运行上述代码后,窗口会显示一个包含初始数据(张三、李四、王五)的表格,且动态添加的“赵六”行和更新后的“李思思”会自动显示视图中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值