2014-12-03 30 views
0

我是Qt新手,我想了解一些東西。 比方說,我有一個字符串列表:在Qt中使用Model/View時如何更改數據的ListView表示形式?

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

而且我有一個模型:

QStringListModel fruitModel; 
fruitModel.setStringList(fruits); 

這種模式連接到ListView控件:

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

我帶有水果列表的ListView:

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

這是很好的,但我要的是使這個名單編號(例如)

    1. Apple
  • 草莓
  • 芒果
    1. Blackberry

我知道的是,我可以排序或過濾這些項目。但是,我可以使用模型更改數據的表示形式,而無需觸摸原始StringList?

+0

您是否希望數字作爲單元格內容的一部分顯示爲水果名稱前面的文本,還是希望數字作爲行標籤出現在左側? – Silicomancer 2014-12-03 17:10:03

回答

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); 
相關問題