在 Qt 中使用模型/视图时如何更改数据的 ListView 表示?

Posted

技术标签:

【中文标题】在 Qt 中使用模型/视图时如何更改数据的 ListView 表示?【英文标题】:How to change ListView representation of data, when using of Model/View in Qt? 【发布时间】:2014-12-03 17:03:22 【问题描述】:

我是 Qt 新手,我想了解一些东西。 假设我有一个字符串列表:

QStringList fruits;
fruits << << "Apple" << "Orange" << "Strawberry" << "Mango" << "Blackberry"

我有一个模型:

QStringListModel fruitModel;
fruitModel.setStringList(fruits);

此模型连接到 ListView 小部件:

QListView lw;
lw.setModel(&fruitsModel);
lw.show();

我有一个带有水果列表的 ListView:

苹果 橙色 草莓 芒果 黑莓

很好,但我想要的是让这个列表编号(例如)

    苹果
    橙色
    草莓
    芒果
    黑莓

我知道我可以对这些项目进行排序或过滤。但是我可以在不触及原始 StringList 的情况下使用模型更改数据的表示吗?

【问题讨论】:

您希望数字作为单元格内容的一部分在水果名称前面显示为文本,还是希望数字作为行标签显示在左侧? 【参考方案1】:

您可以使用代理模型来更改要返回到视图的数据,尤其是 Qt::DisplayRole:

class EnumerateProxyModel : public QIdentityProxyModel

public:
    explicit EnumerateProxyModel(QObject *parent = 0)
        : QIdentityProxyModel(parent) 
    
    

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const 
        if (role == Qt::DisplayRole) 
            return QStringLiteral("%1. %2").arg(QString::number(index.row() + 1),
                                                QIdentityProxyModel::data(index, Qt::DisplayRole).toString());
        

        return QIdentityProxyModel::data(index, role);
    
;

然后将其设置在视图上而不是原始模型上:

QStringListModel fruitModel;
...
EnumerateProxyModel enumerateProxy;
enumerateProxy.setSourceModel(&fruitModel);
lw.setModel(&enumerateProxy);

【讨论】:

以上是关于在 Qt 中使用模型/视图时如何更改数据的 ListView 表示?的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 模型/视图中修改数据表示

Qt 模型/视图:如何正确处理底层数据

Qt--模式视图设计

Qt:如何在模型/视图设置中同步对来自多个线程的数据的访问?

QT/QML:模型没有数据时如何显示消息

Qt4 模型/视图 - 在视图中转换数据?