Название: Отобразить древовидную модель в QTableView и QListView
Отправлено: notAll от Октябрь 11, 2016, 21:33
Есть, для примера, простая модель, которая у меня отображается в 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
Название: Re: Отобразить древовидную модель в QTableView и QListView
Отправлено: notAll от Ноябрь 04, 2016, 22:55
Проблема на досуге решилась. Простая банальная ошибка при заполнении модели. C++ (Qt) 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* internalItem = new QStandardItem(); internalItem->setData(m_data[row].second[internalRow].age, Qt::DisplayRole); items << internalItem; item->appendRow(items); } setItem(row, item); } }
C++ (Qt) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); model = new TreeModel(this); ui->listView->setModel(model); ui->tableView->setModel(model); connect( ui->listView, SIGNAL(clicked(const QModelIndex &)), ui->tableView, SLOT(setRootIndex(const QModelIndex &)) ); ui->tableView->setRootIndex(model->index(0, 0)); }
|