I'm trying to use the same model to display pieces of information on 2 different kind of view.
I need to show information about 150 objects that have a description and can be either on or off.
One of the view is a summary of the on/off states of my objects in a table (15 by 10) of icons.
The other view is a list of 150 rows that display the state of the objects and their descriptions.
I tried to subclass a QAbstractTableModel
and return a different rowCount and columnCount value depending of the view used and it works (my 150 objects are all shown in the table and in the list) but it remove the clear separation between model and view given that I need to specifically tell the model which view is using it and it doesn't work as expected when I try to link the 2 selection models of the views together because QModelIndex
changes when the row and columns counts change.
Any idea of what could be a better approach to my problem or a way to solve the selection issue?
EDIT due to @ramtheconqueror response:
The response from ramtheconqueror led me to the right direction but surprisingly I discovered that the ProxyModel takes the overriden columnCount and rowCount function into account for the widget size calculation but do not actually use them for the widget indexes.
I mean that regarding my example above, the ListView using the new ProxyModel was a widget with enough space for 150 rows but was only showing the first 10 (rowCount in the source model).
Therefore, I did it the other way around and used a QAbstractListModel
as the main model an set the QTableView
to use the Proxy model but again the table was correctly a 15 by 10 widget but with content only on the first column.
I had to change the return value of ColumnCount to 15 on my QAbstractListModel
subclass to get the correct result (even if it's really a list and therefore only contains one column).
Am I doing something wrong? I just don't understand why it behaves like that...
As you already have QAbstractTableModel
, create a proxy model for the list view. Simple implementation would be like
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);