2013-10-06 28 views
2

我有一個關於QAbstractTableModel的基礎數據源的實現的一般問題。使用QAbstractTableModel實現與自定義類的QList

QAbstractTableModel::data()函數通過由行和列值組成的索引訪問數據源內容。

如果我的基礎數據源是Person類的QList,其中每個成員都代表一列,那麼如何使用給定的列索引訪問其成員?

我能想到的唯一辦法是,我用一種映射,這列編號映射到Person類的成員:

QVariant TableModel::data(const QModelIndex &index, int role) const 
{ 
    if (role == Qt::DisplayRole) 
    { 
     Person person = mySource[index.row()]; 

     if (index.column() == 0) 
      return person.getName(); 
     else if (index.column() == 1) 
      return person.getAdress(); 
     (...and so on..) 
    } 
    return QVariant(); 
} 

是這種方法來解決這個問題,或者是有更好的嗎?如果我的班級有50名成員,那麼很多工作要做。當我通過QAbstractTableModel::setData()向源寫入數據時,必須完成同樣的事情。

有助於我理解Qt模型/視圖實現的這部分內容的答案或鏈接非常感興趣。

回答

0

這是解決這個問題的方法,還是有更好的方法呢?

當然是一個有效的方法,是的。即使QMetaObject也沒有反省功能。

如果我的班級有50名成員,那將是很多工作要做。當我通過QAbstractTableModel :: setData()向源寫入數據時,必須做同樣的事情。

好吧,你不可能得到50個不同的成員,但是在那種情況下,管理你的班級本來就很複雜。

有助於我理解Qt中模型/視圖實現的這部分內容的答案或鏈接非常感興趣。

這裏沒有太多的鏈接,真的。詳情見上文。

0

我想我找到了我的問題的答案。不太清楚所有這些都會詳細解決,但我認爲這是要走的道路()。

[...]雖然該模型的方法使用該項指數的概念,有時是不可能的或方便易查明該項目的表示只是使用行數和列數和的一個索引項工作家長。幸運的是,該指數不止於此。一個指針(void *)或一個附加數字(int)可以與一個索引相關聯,該索引可以指向該項目的內部數據表示(一個指向數據結構的指針或一個數組中元素的索引,map或類似的東西)。由於這種機制,方法可以直接訪問表示項目的數據結構。

from http://www.qtcentre.org/wiki/index.php?title=QAbstractItemModel#Implementing_custom_models