我对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中模型/视图实现的这一部分的材料的答案或链接非常受欢迎。
答案 0 :(得分:0)
这是解决这个问题的方法还是有更好的方法?
当然是一种有效的方法,是的。即使使用QMetaObject,也没有内省功能。
如果我的班级有50名成员,那将会有很多工作要做。当我通过QAbstractTableModel :: setData()将数据写入源时,必须完成同样的事情。
嗯,你不可能得到50个不同的成员,但在这种情况下,管理你的课程本来就很复杂。
有助于我理解Qt中模型/视图实现的这一部分的材料的答案或链接非常受欢迎。
这里没有多少链接,真的。有关详细信息,请参见上文。
答案 1 :(得分:0)
我想我找到了问题的答案。不太确定这一切将如何详细解决,但我认为这是走的路()。
[...]尽管模型方法使用项目索引概念对项目进行操作,但有时仅使用行号和列号以及父项的索引来确定项目的表示是不可能或不方便的。幸运的是,该指数带来了更多。指针(void *)或附加数字(int)可以与索引相关联,索引可以指向项的内部数据表示(指向数据结构的指针或数组中元素的索引,映射或类似的东西)。由于这种机制,方法可以直接访问表示项目的数据结构。
来自http://www.qtcentre.org/wiki/index.php?title=QAbstractItemModel#Implementing_custom_models