2011-03-22 23 views
1

我正在寫一個Qt應用程序以允許非常重的數據集的可視化。因此,我有一個SourceDataModel類,繼承QAbstractItemModel似乎正常工作(目前,我只顯示它在QTableView/QTreeView但後來,我會創建一些自定義視圖)。創建一個QAbstractModelItem的代理

現在,我想能夠過濾該數據,即

  1. 能夠具有不同的數據 分辨率(即僅暴露1 數據項總分2)

  2. 能夠 應用上的數據的過濾器的一些(即 顯示UNIX時間戳作爲 DD/MM/YYYY HH:MM:SS)

所以我開始創建一個ProxySourceDataModel類,它繼承自我的SourceDataModel並存儲一個實例,並基本上將所有內容委託給實例。從這個ProxySourceDataModel,我注意到當我在QTableView中使用它時沒有顯示任何數據。經過一番調查,似乎是因爲我不得不從底層的SourceDataModel轉發信號和插槽。沒問題,我做到了。

但仍2問題依然存在,而且我無法弄清楚如何處理它們:

  1. 我不能夠在視圖中選擇數據。如果我直接使用SourceDataModel,沒問題。但使用ProxySourceDataModel我不能選擇任何東西。

  2. 數據根本沒有被過濾!我在ProxySourceDataModel中超載了數據(),並將所有其他調用轉發給底層的SourceDataModel。但仍然只有SourceDataModel::data()被調用。

下面是一些代碼來說明我在做什麼:

class SourceDataModel : public QAbstractItemModel 
{ 
    //... 
}; 

class ProxySourceDataModel : public SourceDataModel 
{ 
public: 
    ProxySourceDataModel(SourceDataModel& model) 
    : model_(model) 
    { 
    // For all QAbstractItemModel's signals emitted by the underlying model, 
    // I propagate them like this 
    QObject::connect(&model_, SIGNAL(  the_signal()), 
         this, SLOT (forward_the_signal())) ; 
    } 

slots: 
    void forward_the_signal() 
    { 
    emit the_signal(); 
    } 

public: 
    // For all QAbstractItemModel's virtual function, I do something like this 
    virtual void the_function() 
    { 
    model_.the_function(); 
    } 

    // This is where I was hoping to do the filtering 
    virtual QVariant data(const QModelIndex& index,int role=Qt::DisplayRole) 
    { 
    return filter(model_.data(index,role)); 
    } 

private: 
    SourceDataModel& model_; 
}; 

SourceDataModel sourceDataModel; 
QTableView  view; 
view.setModel(new ProxySourceDataModel(sourceDataModel)); 

任何幫助或建議非常讚賞,感謝您的閱讀!

--------------------編輯------------------------

我發現它!

的問題是該視圖不使用QAbstractItemModel::data()從它的模式,而是呼籲0​​它的項目,進而調用該項目的底層模型的QAbstractItemModel::data()。 而且由於我的代理從底層模型返回了模型索引,這就是爲什麼SourceDataModel::data()總是被調用而不是ProxySourceDataModel()

我剛剛重新實現了ProxySourceDataModel::index()返回本地索引,它就像一個魅力。 訪問In QT, chaining models does not work as expected瞭解更多信息。

謝謝!

+0

可能的重複[在QT中,鏈接模型不能按預期工作](http://stackoverflow.com/questions/1387912/in-qt-chaining-models-does-not-work-as-expected) – NewbiZ 2011-03-23 11:03:28

回答

2

問題在於該視圖並未使用其模型中的QAbstractItemModel::data(),而是在其項目上調用QModelIndex::data(),該項目依次調用項目基礎模型的QAbstractItemModel::data()。 而且由於我的代理從底層模型返回了模型索引,這就是爲什麼SourceDataModel::data()總是被調用而不是ProxySourceDataModel()

我剛剛重新實現了ProxySourceDataModel::index()返回本地索引,它就像一個魅力。 訪問In QT, chaining models does not work as expected瞭解更多信息。