2013-01-07 23 views
8

我需要用Qt实现一个表。如何在QAbstractTableModel中设置数据

我相信我会起诉QAbstractTableModel,并使用此模型的QTableView。我知道我将不得不编辑模型的rowCount(),columnCount()和data()函数。

不过,我不知道如何正确地设定模型中的数据,使数据()函数可以检索它..

是为这个目的使用setData()函数?我已经看到它把EditRole作为它的参数,我不想要,因为我不希望我的表是可编辑的。因此,如何使用data()函数在模型中“设置”数据,或让模型获取数据?

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

请帮我这个。

谢谢。

+2

[This](http://qt-project.org/doc/qt-4.8/itemviews-addressbook.html)就是一个例子。 –

+0

谢谢你。帮了很多。 – user1173240

回答

14

实际数据如何保存在内存中,从数据存储生成或查询完全取决于您。如果它是静态数据,则可以使用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有你需要知道的一切。

+0

非常感谢您的及时帮助。我一定会研究它。 – user1173240

+0

@dschulz,在第一次初始化时使用beginInsertRows()等是绝对必要的吗?然后我不明白dataChanged()的目的。为什么Qt只能使用rowCount(),columnCount()和data()来获取信息?为什么需要使用beginInsertRows()等来创建行和列? –

+0

@Cool_Coder是的,如果你重新实现'insertRows()',这是必须的。在将项目添加到模型的数据容器(无论是“QList”还是您使用的任何容器类)之前,您必须调用'beginInsertRows()'。请注意,“数据已更改”并不一定意味着正在添加或删除行或列。 'dataChanged()'表示模型中_existing items_中的数据已更新,因此视图可以检索更新的数据。只要想一想当你在一个可编辑的'QTableView'单元中改正你的名字时会发生什么。 – dschulz

相关问题