16

我需要用 Qt 实现一个表。

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

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

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

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

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

另外,data() 函数是如何调用的,即,谁调用它,它需要在哪里调用?

请帮我解决一下这个。

谢谢。

4

2 回答 2

26

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

您只需要重新实现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 文档包含您需要了解的所有信息。

于 2013-01-07T05:08:14.597 回答
7

你不需要使用setData(...). 相反,您需要以这样的方式进行子类化,QAbstractTableModel即它的方法rowCount()、、和可能返回您希望显示的数据。下面是一个基于 PyQt5 的示例:columnCount()data(index)headerData(section, horizontalOrVertical)

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 存储库并显示下表:

QAbstractTableModel 示例

于 2019-07-02T15:07:50.613 回答