Russian Qt Forum
Апрель 25, 2024, 08:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отобразить древовидную модель в QTableView и QListView  (Прочитано 4234 раз)
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
Записан
notAll
Гость
« Ответ #1 : Ноябрь 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));
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 20.