2

I have a general question about the implementation of the underlying data source of a QAbstractTableModel.

The QAbstractTableModel::data() function access the data sources content by an index consisting of a row and a column value.

If my underlying data source is a QList of Person classes, where each member represents a column, how do I access its members with a given column index?

The only approach I can think of is that I use a kind of mapping, that maps a column number to a member of the Person class:

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();
}

Is this the approach to tackle this problem or is there a better one? If my class has 50 members that would be a lot of work to do. The same thing must be done, when I write data to the source via QAbstractTableModel::setData().

Answers or links to material that would help me to understand this part of the model/view implementation in Qt are very much appriciated.

4

2 回答 2

0

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

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

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

嗯,你不太可能得到 50 个不同的成员,但在这种情况下,管理你的班级本来就很复杂。

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

真的,这里没有太多要链接的东西。有关详细信息,请参见上文。

于 2013-10-06T05:57:33.600 回答
0

我想我找到了问题的答案。不太确定这一切将如何详细解决,但我认为这就是要走的路()。

[...] 尽管模型方法使用项索引概念对项进行操作,但有时仅使用行号和列号以及父项的索引来确定项的表示是不可能或不方便的。幸运的是,该指数包含的远不止这些。指针(void*)或附加数字(int)可以与索引相关联,索引可以指向项目的内部数据表示(指向数据结构的指针或数组中元素的索引,map或类似的东西)。由于这种机制,方法可以直接访问表示项目的数据结构。

来自http://www.qtcentre.org/wiki/index.php?title=QAbstractItemModel#Implementing_custom_models

于 2013-10-06T18:07:41.550 回答