在 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 表示?的主要内容,如果未能解决你的问题,请参考以下文章