Qt对QListView和QTableView使用相同的模型

时间:2016-02-05 14:35:38

标签: c++ qt model-view

我试图使用相同的模型来显示2种不同视图的信息。

我需要显示有关具有描述的150个对象的信息,可以打开或关闭。

其中一个视图是我的对象在图表(15 x 10)中的开/关状态摘要。

另一个视图是150行的列表,显示对象的状态及其描述。

我尝试将QAbstractTableModel子类化并根据所使用的视图返回不同的rowCount和columnCount值,并且它可以工作(我的150个对象都显示在表格和列表中)但它删除了清晰的分隔在模型和视图之间,我需要专门告诉模型哪个视图正在使用它,并且当我尝试将视图的2个选择模型链接在一起时,它没有按预期工作,因为QModelIndex在行和列计数变化。

有什么想法可以更好地解决我的问题或解决选择问题?

由于@ramtheconqueror响应而编辑:

来自ramtheconqueror的回应让我走向正确的方向,但令人惊讶的是我发现ProxyModel将窗口小部件计算中的overriden columnCount和rowCount函数考虑在内,但实际上并没有将它们用于窗口小部件索引。

我的意思是,就我上面的例子而言,使用新的ProxyModel的ListView是一个小部件,有足够的空间容纳150行,但只显示前10个(源模型中的rowCount)。

因此,我反过来做了它并使用QAbstractListModel作为主要模型设置QTableView使用代理模型但是表再次正确地是一个15乘10的小部件但是内容仅在第一列 我必须在我的QAbstractListModel子类上将ColumnCount的返回值更改为15以获得正确的结果(即使它实际上是一个列表,因此只包含一列)。

我做错了吗?我只是不明白它为什么会这样......

1 个答案:

答案 0 :(得分: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);