我正在寫一個Qt應用程序以允許非常重的數據集的可視化。因此,我有一個SourceDataModel
類,繼承QAbstractItemModel
似乎正常工作(目前,我只顯示它在QTableView/QTreeView但後來,我會創建一些自定義視圖)。創建一個QAbstractModelItem的代理
現在,我想能夠過濾該數據,即
能夠具有不同的數據 分辨率(即僅暴露1 數據項總分2)
能夠 應用上的數據的過濾器的一些(即 顯示UNIX時間戳作爲 DD/MM/YYYY HH:MM:SS)
所以我開始創建一個ProxySourceDataModel
類,它繼承自我的SourceDataModel
並存儲一個實例,並基本上將所有內容委託給實例。從這個ProxySourceDataModel
,我注意到當我在QTableView
中使用它時沒有顯示任何數據。經過一番調查,似乎是因爲我不得不從底層的SourceDataModel
轉發信號和插槽。沒問題,我做到了。
但仍2問題依然存在,而且我無法弄清楚如何處理它們:
我不能夠在視圖中選擇數據。如果我直接使用
SourceDataModel
,沒問題。但使用ProxySourceDataModel
我不能選擇任何東西。數據根本沒有被過濾!我在
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瞭解更多信息。
謝謝!
可能的重複[在QT中,鏈接模型不能按預期工作](http://stackoverflow.com/questions/1387912/in-qt-chaining-models-does-not-work-as-expected) – NewbiZ 2011-03-23 11:03:28