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

Posted

技术标签:

【中文标题】将 QAbstractTableModel 实现与自定义类的 QList 一起使用【英文标题】:Use QAbstractTableModel implementation with a QList of custom classes 【发布时间】:2013-10-06 05:03:59 【问题描述】:

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

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

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

我能想到的唯一方法是使用一种映射,将列号映射到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 中模型/视图实现的这一部分的材料的答案或链接。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于将 QAbstractTableModel 实现与自定义类的 QList 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

QAbstractTableModel:index() 与 createIndex()

如何使用 QAbstractTableModel 而不是 QSortFilterProxyModel 进行排序和过滤

我需要实现自己的 QAbstractTableModel 吗?

从 QTableView 中的选定行访问 QAbstractTableModel 中的原始索引

如何彻底改变 QAbstractTableModel 的底层数据?

TableView重新实现QAbstractTableModel后表中没有数据显示