在Qt中使用Model / View时,如何更改ListView的数据表示?

时间:2014-12-03 17:03:23

标签: qt view model

我是Qt的新手,我想了解一些事情。 让我们说,我有一个字符串列表:

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

我有一个模特:

QStringListModel fruitModel;
fruitModel.setStringList(fruits);

此模型连接到ListView小部件:

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

我得到了一个包含水果列表的ListView:

  • 苹果
  • 草莓
  • 芒果
  • 黑莓

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

    1. 苹果
    1. 草莓
    1. 芒果
    1. 黑莓

我所知道的是我可以对这些项目进行排序或过滤。但是,我可以使用模型更改数据的表示,而无需触及原始的StringList吗?

1 个答案:

答案 0 :(得分:0)

您可以使用代理模型来更改要返回到视图的数据,尤其是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);