您不需要使用setData(...)
。相反,您需要以这样的方式对QAbstractTableModel
进行子类化,使其方法rowCount()
、columnCount()
、data(index)
和可能的headerData(section, horizontalOrVertical)
返回您希望显示的数据。以下是一个基于PyQt5的示例:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
headers = ["Scientist name", "Birthdate", "Contribution"]
rows = [("Newton", "1643-01-04", "Classical mechanics"),
("Einstein", "1879-03-14", "Relativity"),
("Darwin", "1809-02-12", "Evolution")]
class TableModel(QAbstractTableModel):
def rowCount(self, parent):
return len(rows)
def columnCount(self, parent):
return len(headers)
def data(self, index, role):
if role != Qt.DisplayRole:
return QVariant()
return rows[index.row()][index.column()]
def headerData(self, section, orientation, role):
if role != Qt.DisplayRole or orientation != Qt.Horizontal:
return QVariant()
return headers[section]
app = QApplication([])
model = TableModel()
view = QTableView()
view.setModel(model)
view.show()
app.exec_()
这是从GitHub存储库获取的,展示了以下表格:
![QAbstractTableModel example](https://github.com/pyqt/examples/raw/_/src/screenshots/qabstracttablemodel-example.png)
insertRows()
方法,这是必需的。在向模型的数据容器(无论是QList
还是其他容器类)添加项目之前,你必须调用beginInsertRows()
。需要注意的是,“数据已更改”并不一定意味着正在添加或删除行或列。dataChanged()
意味着模型中现有项目的数据已更新,因此视图可以检索到这些已更新的数据。只要想象一下当你在可编辑的QTableView
单元格中更正你的名字时会发生什么。 - dschulzbeginInsertRows()
和endInsertRows()
,特别是如果您尚未将模型附加到视图上。 - dschulzdataChanged()
函数适用于现有模型中任何类型的数据更改,即可能更改行数和列数,也可能更改现有行中的数据。我曾遇到这样的问题,新行被插入,但是dataChanged()
信号可能没有传达相同的信息,因为在我的视图中没有插入新行,只有在行内更改了现有数据时,视图中的数据才会发生变化。 - user1173240