如何在QAbstractTableModel中设置数据

时间:2013-01-07 03:59:19

标签: qt qtableview qabstracttablemodel

我需要用Qt实现一个表。

我相信我会使用这个模型使用QTableView来起诉QAbstractTableModel。

我知道我必须编辑模型的rowCount(),columnCount()和data()函数。

但是,我不明白如何在模型中精确设置数据,以便data()函数可以检索它..

是否为此提供了setData()函数?我已经看到它需要EditRole作为参数,我不想要,因为我不希望我的表格可以编辑。

那么,我如何使用data()函数在模型中“设置”数据,或者让模型获得数据?

另外,如何调用data()函数,即谁调用它以及需要调用它的位置?

请帮助我。

感谢。

2 个答案:

答案 0 :(得分:18)

实际数据如何保存在内存中,从数据存储中生成或查询完全取决于您。如果是静态数据,您可以使用Qt container classes或自定义数据结构。

您只需为可编辑模型重新实现setData()方法。

您需要在不可编辑的QAbstractTableModel子类中实现4种方法:

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole )
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

从视图中调用这些方法,通常是QTableView实例。前两个方法应该返回表的维度。例如,如果rowCount()返回10columnCount()返回4,则视图将调用data()方法40次(每个单元格一次),要求模型内部数据结构中的实际数据。

例如,假设您已在模型中实现了自定义广告位retrieveDataFromMarsCuriosity()。此插槽填充数据结构并连接到QPushButton实例,因此您可以通过单击按钮获取新数据。 现在,您需要让视图知道何时更改数据,以便可以正确更新。这就是为什么你需要发出beginRemoveRows()endRemoveRows()beginInsertRows()endInsertRows()及其列对应的原因。

Qt Documentation包含您需要了解的所有内容。

答案 1 :(得分:0)

您不需要使用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):
        # How many rows are there?
        return len(rows)
    def columnCount(self, parent):
        # How many columns?
        return len(headers)
    def data(self, index, role):
        if role != Qt.DisplayRole:
            return QVariant()
        # What's the value of the cell at the given index?
        return rows[index.row()][index.column()]
    def headerData(self, section, orientation, role:
        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
            return QVariant()
        # What's the header for the given column?
        return headers[section]

app = QApplication([])
model = TableModel()
view = QTableView()
view.setModel(model)
view.show()
app.exec_()

它取自此GitHub repository,并显示下表:

QAbstractTableModel example