C++ 将QAbstractTableModel实现与自定义类的QList一起使用

C++ 将QAbstractTableModel实现与自定义类的QList一起使用,c++,qt,qtgui,qabstracttablemodel,C++,Qt,Qtgui,Qabstracttablemodel,我对QAbstractTableModel的底层数据源的实现有一个一般性的问题 QAbstractTableModel::data()函数通过一个由行和列值组成的索引来访问数据源内容 如果我的基础数据源是QList的Person类,其中每个成员代表一列,那么如何使用给定的列索引访问其成员 我能想到的唯一方法是使用一种映射,将列编号映射到Person类的成员: QVariant TableModel::data(const QModelIndex &index, int role) con

我对
QAbstractTableModel
的底层数据源的实现有一个一般性的问题

QAbstractTableModel::data()
函数通过一个由行和列值组成的索引来访问数据源内容

如果我的基础数据源是
QList
Person
类,其中每个成员代表一列,那么如何使用给定的列索引访问其成员

我能想到的唯一方法是使用一种映射,将列编号映射到
Person
类的成员:

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
    {
        Person person = mySource[index.row()];

        if (index.column() == 0)
            return person.getName();
        else if (index.column() == 1)
            return person.getAdress();
        (...and so on..)
    }
    return QVariant();
}
这是解决这个问题的方法还是有更好的方法?如果我的班级有50名成员,那将是很多工作要做。当我通过
QAbstractTableModel::setData()
向源代码写入数据时,必须执行相同的操作

非常感谢能够帮助我理解Qt中模型/视图实现这一部分的答案或材料链接

这是解决这个问题的方法还是有更好的方法

当然是一个有效的方法,是的。即使使用了,也没有自省功能

如果我的班级有50名成员,那将是很多工作要做。当我通过QAbstractTableModel::setData()将数据写入源时,必须执行相同的操作

好吧,你不太可能得到50个不同的成员,但是在这种情况下,管理你的类本质上是复杂的

非常感谢能够帮助我理解Qt中模型/视图实现这一部分的答案或材料链接


这里没有太多的链接,真的。详见上文。

我想我找到了问题的答案。我不太确定这一切将如何在细节上运作,但我认为这是前进的方向()

[…]尽管模型方法使用项索引概念对项进行操作,但有时仅使用行和列编号以及父项的索引来精确定位项的表示是不可能的,也不方便的。幸运的是,该指数承载的内容不止这些。指针(void*)或附加数字(int)可与索引关联,该索引可指向项的内部数据表示形式(指向数据结构的指针或数组、映射或类似对象中元素的索引)。由于这种机制,方法可以直接访问表示项的数据结构