Что не так с моей моделью MVC?

96
29 января 2021, 15:00

Сделал модель, и пример данных, но они не отображаются ни в tableView, ни в columnView. Что делаю не так?

Вопрос связан с Помогите с реализацией модели (MVC) в QT.

Структура проекта:

Окно приложения
Скриншот окна

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "somemodel.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QList<Some> b;
    for (int i = 0; i < 2; ++i) {
        Some s;
        s.id = i + 1;
        s.name = QString("Name%1").arg(i);
        for (int j = 0; j < 5; ++j) {
            Some2 s2;
            s2.id = (i + 1) * 10 + j;
            s2.description = QString("Description: %1").arg((i + 1) * 10 + j);
            s.child.append(s2);
        }
        b.append(s);
    }
    SomeModel *sm = new SomeModel(b, this);
    ui->tableView->setModel(sm);
    ui->columnView->setModel(sm);
}
MainWindow::~MainWindow() { delete ui; }

somemodel.h

#ifndef SOMEMODEL_H
#define SOMEMODEL_H
#include <QAbstractListModel>
struct Some2 {
    static const QStringList FIELD_TEXT;
    int id;
    QString description;
};
struct Some {
    static const QStringList FIELD_TEXT;
    QString name;
    int id;
    QList<Some2> child;
    QString operator[] (const int index) const;
};
class SomeModel : public QAbstractListModel
{
    Q_OBJECT
public:
    SomeModel(QObject *parent = nullptr) : QAbstractListModel(parent) { }
    SomeModel(QList<Some> bases, QObject *parent = nullptr)
        : QAbstractListModel(parent), _bases(bases) {  }
    int rowCount(const QModelIndex &parent) const override;
    int columnCount(const QModelIndex &parent) const override;
    QVariant data(const QModelIndex &index, int role) const override;
protected:
    QList<Some> _bases;
public:
    QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
};
#endif // SOMEMODEL_H

somemodel.cpp

#include "somemodel.h"
// Some / Some2
const QStringList Some2::FIELD_TEXT = QStringList() << "ID" << "Description";
const QStringList Some::FIELD_TEXT = QStringList() << "Name" << "ID";
QString Some::operator[](const int index) const
{
    if (index == 0) { return name; }
    if (index == 1) { return QString::number(id); }
    return nullptr;
}
// SomeModel
int SomeModel::rowCount(const QModelIndex &parent) const
{
    if (!parent.isValid()) { return 0; }
    return _bases.size();
}
int SomeModel::columnCount(const QModelIndex &parent) const
{
    if (!parent.isValid()) { return 0; }
    return Some::FIELD_TEXT.size();
}
QVariant SomeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) { return QVariant(); }
    if (index.row() < 0 || index.row() >= _bases.size()
            || index.column() < 0 || index.column() >= 2) { return QVariant(); }
    if (role != Qt::DisplayRole) { return QVariant(); }
    return _bases.at(index.row())[index.column()];
}
QVariant SomeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole) { return QVariant(); }
    if (orientation == Qt::Horizontal) {
        return Some::FIELD_TEXT.at(section);   // можно добавить проверку на sect < FIELD.size()
    } else if (orientation == Qt::Vertical) {
        return QString::number(section);
    }
    return QVariant();
}

UDP:
При дебаге обнаружил, что rowCount, columnCount вызывается с некорректным parent (parent.isValid() == false). Как это исправить?

READ ALSO
Как отобразить текст в Label в нижнем индексе

Как отобразить текст в Label в нижнем индексе

Делаю шаблон для отчета в QtRPT 20

116
Передача поля/метода класса

Передача поля/метода класса

Существует класс Realty в котором экземпляры Apartment и вектор с объектами catalogМетод price_filter должен фильтровать объекты по переменной price

132
Ошибка при вводе. Структуры C++

Ошибка при вводе. Структуры C++

Необработанное исключение по адресу 0x00007FF86C6A8028 (ucrtbasedll) в Project1

376
Ошибка в подключении jQuery

Ошибка в подключении jQuery

Хотел подключить jQuery, но выдает массу ошибок, как исправить не знаю ,скрины прилагаю:

128