Есть, для примера, простая модель, которая у меня отображается в QTreeView:
#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QStandardItemModel>
class TreeModel : public QStandardItemModel
{
Q_OBJECT
public:
explicit TreeModel(QObject *parent = nullptr);
void initialize();
private:
struct Person
{
QString name;
int age;
};
QVector<QPair<QString, QVector<Person>>> m_data
{
{"Group A", {{"Ivanov", 22}, {"Petrov", 24}, {"Sidorov", 19}}},
{"Group B", {{"Kozlov", 20}, {"Scot", 23}, {"Simon", 20}}},
{"Group C", {{"Volov", 29}, {"Lemon", 25}, {"Snijov", 21}}}
};
};
#endif // TREEMODEL_H
#include "treemodel.h"
#include <QSpacerItem>
TreeModel::TreeModel(QObject *parent) : QStandardItemModel(parent)
{
initialize();
};
void TreeModel::initialize()
{
setHorizontalHeaderLabels(QStringList() << "Group/Name" << "Age");
setColumnCount(2);
setRowCount(m_data.size());
for (int row = 0; row < rowCount(); ++row)
{
QStandardItem* item = new QStandardItem(m_data[row].first);
for (int internalRow = 0; internalRow < m_data[row].second.size(); ++internalRow)
{
QList<QStandardItem*> items;
items << new QStandardItem(m_data[row].second[internalRow].name);
QStandardItem* item = new QStandardItem;
item->setData(m_data[row].second[internalRow].age, Qt::DisplayRole);
items << item;
item->appendRow(items);
}
setItem(row, item);
}
}
Мне надо эту модель отобразить еще и в QListView и QTableView. В QListView должны будут отображаться самые верхние родительские элементы, и при клике на любой из них в QTableView должны отобразиться их дочерние элементы в виде таблицы. Как такое можно реализовать? Насколько я понял, надо писать свою прокси модель для QTableView. Какие методы тогда там надо будет переопределить? Подскажите хотя бы примерную реализацию такого кода.
У меня пока что только вот:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new TreeModel(this);
//tableProxyModel = new TableProxyModel(this);
//tableProxyModel->setSourceModel(model);
ui->listView->setModel(model);
ui->tableView->setModel(model);
//ui->tableView->setModel(tableProxyModel);
// QItemSelectionModel *selection = new QItemSelectionModel(model, this);
// ui->listView->setSelectionModel(selection);
// ui->tableView->setSelectionModel(selection);
connect(ui->listView, SIGNAL(clicked(const QModelIndex&)),
ui->tableView, SLOT(setRootIndex(const QModelIndex&)));
}
#ifndef TABLEPROXYMODEL_H
#define TABLEPROXYMODEL_H
#include <QSortFilterProxyModel>
class TableProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit TableProxyModel(QObject *parent = nullptr);
};
#endif // TABLEPROXYMODEL_H