我试图使用相同的模型来显示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以获得正确的结果(即使它实际上是一个列表,因此只包含一列)。
我做错了吗?我只是不明白它为什么会这样......
答案 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);