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

Qt use same model for QListView and QTableView

我正在尝试使用相同的模型在 2 种不同的视图上显示信息。

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

其中一个视图是在 table(15 x 10)图标中我的对象的 on/off 状态的摘要。

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

我尝试根据使用的视图将 QAbstractTableModel 和 return 子类化为不同的 rowCount 和 columnCount 值(我的 150 个对象都显示在 table 和在列表中)但它消除了模型和视图之间的明确分离,因为我需要具体告诉模型哪个视图正在使用它并且当我尝试 link 的 2 个选择模型时它没有按预期工作视图在一起,因为 QModelIndex 在行数和列数发生变化时发生变化。

知道什么可以更好地解决我的问题或解决选择问题吗?

编辑由于@ramtheconqueror 回复:

ramtheconqueror 的回复让我找到了正确的方向,但令人惊讶的是,我发现 ProxyModel 将覆盖的 columnCount 和 rowCount 函数考虑到小部件大小计算中,但实际上并没有将它们用于小部件索引。

我的意思是,关于我上面的示例,使用新 ProxyModel 的 ListView 是一个小部件,具有足够 space 的 150 行,但仅显示前 10 行(源模型中的 rowCount)。

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

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

因为您已经 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);