【问题标题】:How to change ListView representation of data, when using of Model/View in Qt?在 Qt 中使用模型/视图时如何更改数据的 ListView 表示?
【发布时间】: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:

  • 苹果
  • 橙色
  • 草莓
  • 芒果
  • 黑莓

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

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

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

【问题讨论】:

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

标签: qt view model


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2012-10-20
    相关资源
    最近更新 更多