2016-02-05 128 views
1

我試圖使用相同的模型來顯示2種不同類型的視圖上的信息。Qt爲QListView和QTableView使用相同的模型

我需要顯示有關具有說明並且可以打開或關閉的150個對象的信息。

一個視圖的是我的對象的通/斷狀態的圖標的表(15 10)的摘要。

另一個視圖是150行的列表,顯示對象的狀態及其描述。

我試着對QAbstractTableModel進行子類化,並返回一個不同的rowCount和columnCount值,這取決於所用的視圖和它的工作原理(我的150個對象全部顯示在表格和列表中),但它刪除了模型和鑑於我需要明確地告訴模型哪個視圖正在使用它,並且當我嘗試將視圖的兩個選擇模型鏈接在一起時它不會如預期的那樣工作,因爲當行和列計數改變時QModelIndexes會改變。

的,這可能是我的問題更好的方法或解決問題的選擇辦法的任何想法?

EDIT由於@ramtheconqueror響應:

從ramtheconqueror的反應使我朝着正確的方向,但令人驚訝我發現ProxyModel採取重寫信息columnCount和rowCount功能考慮在內的小部件尺寸的計算,但做實際上並沒有將它們用於小部件索引。

我的意思是,關於上述我的例子中,使用新的ProxyModel ListView的是具有用於150行足夠空間的插件但只示出了第一10(在源模型rowCount時)。

因此,我反其道而行並使用QAbstractListModel作爲主模型,將QTableView設置爲使用代理模型,但是表格再次正確爲15乘10小部件,但其內容僅在第一列。
我不得不在我的QAbstractListModel子類上將ColumnCount的返回值更改爲15,以獲得正確的結果(即使它真的是一個列表,因此只包含一列)。

我做錯了什麼?我只是不明白爲什麼它的行爲這樣的...

+2

我會實現2個車型共享相同的原始數據池或依賴於其他型號(不QAbstractProxyModel)來完成你的任務一個代理模型。 – OnWhenReady

回答

2

正如你已經有QAbstractTableModel,創建列表視圖的代理模式。簡單的實現會像

TableModel* tableModel = new TableModel(); 
..... 
tableView->setModel(tableModel); 

class ListProxyModel : public QSortFilterProxyModel 
{ 
    Q_OBJECT 

    public: 
    virtual int columnCount(const QModelIndex& idx) const { return 1; } 

    virtual QVariant data(const QModelIndex& idx, int role) const { 
     ... get the actual model index 
     ... ask the tableModel for the actual data 
     ... construct the data (string/int/bool etc) 
     return the data; 
    } 
} 

QListView listView = new QListView(); 
ListProxyModel* listModel = new ListProxyModel(); 
listModel->setModel(tableModel); 
listView->setModel(listModel); 
+2

對於這種情況,您可以使用'QIdentityProxyModel'而不是'QSortFilterProxyModel',因爲您不需要任何篩選或排序。 –

+0

@SaZ,那也可以。 :-) – ramtheconqueror

+0

「這也能起作用」或者說,這就是你應該首先完成的事情。這不是關於什麼工作,而是關於編寫明確地向人類讀者傳達其目的的代碼*。只是因爲機器可以運行它並不適合。記住:代碼首先是人類,機器第二。 –

相關問題