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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как хранить данные в модели??  (Прочитано 1867 раз)
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« : Май 13, 2020, 14:42 »

Добрый день! Есть модель в котором хранится данные на год, колонки это количесво дней в году а строки устанавливается пользователем. Представление должно показывать только выбранный пользователем месяц!  Храню данные в QHach <QModelIndex, QVAriant> но почему то данные сохраняются на один месяц  Плачущий Как реализовать сохранение данных по индексу на год 365 дней а отображать по выбранному месяцу Непонимающий

Код:
class modelG : public QAbstractTableModel
{
    Q_OBJECT

public:
    modelG(int row, int coll, QObject* parent = nullptr);


    // QAbstractItemModel interface
public:
    int _rowCount = 0;
    int _columnCount =0;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);


    void showMonth(int month);

private:
    QDate _date;

protected:
    QHash<QModelIndex, QVariant> cellDate;


signals:
    void dataChanged(QModelIndex, QModelIndex);

    // QAbstractItemModel interface
public:
    Qt::ItemFlags flags(const QModelIndex &index) const;

};

//----------------------------------------------------------------------------------
class DegurnHaur : public modelG
{
    Q_OBJECT
public:
      DegurnHaur(QStringList nameDegurn,  QObject* parent = nullptr);

public slots:
      void setHoursDegurn(int idDegurn, QDate date, int haurs);
      void newData(int degurn, int day, int data);


private slots:
      //void newData(int degurn, int day, int data);

      // QAbstractItemModel interface
private:
      QStringList NameList;
public:
      QVariant headerData(int section, Qt::Orientation orientation, int role) const;
};

Код:
#include "modelg.h"

#include <QBrush>
#include <QColor>
#include <QDebug>


modelG::modelG(int row, int cols, QObject *parent)
    : QAbstractTableModel (parent), _rowCount(row), _columnCount(cols)
{
    //NameList << "Абдулганиева С" << "Курбанова С" << "Титова А" << "Чуркина Е" << "Абдулганиева А";
}

int modelG:: rowCount(const QModelIndex &) const
{
    return _rowCount;
}

int modelG::columnCount(const QModelIndex &) const
{
    return  _columnCount;
}

QVariant modelG::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()){
        return QVariant();
    }
    if(role == Qt::DisplayRole || role == Qt::EditRole){
 //       qDebug() << _date.addDays(index.column()).dayOfYear();
        if(index.column()<_date.daysInMonth())
            return cellDate.value(index.sibling(index.row(), _date.addDays(index.column()).dayOfYear()), QVariant());
    }
    return QVariant();

}

bool modelG::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid()){
        return false;
    }
    if(role == Qt::DisplayRole || role == Qt::EditRole){
        cellDate.insert(index,value);
        qDebug() << index.row();
        qDebug() << index.column();

        emit dataChanged(index, index);
    }
    return false;
}


void modelG::showMonth(int month)
{
    beginResetModel();
    _date = QDate::currentDate();
    _date.setDate(_date.year(), month, 1);
    _columnCount = _date.daysInMonth() + 3;
    qDebug() << cellDate;
//    for(int i=0; i<60; i++){
//       // int day =  _date.addDays(i).dayOfYear();
//        qDebug() << cellDate.value(index(0, i)) << i;
//    }
    endResetModel();
}


Qt::ItemFlags modelG::flags(const QModelIndex &index) const
{
    if (!index.isValid())
           return Qt::NoItemFlags;

       return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable;
}

//-------------------------------------------------------------------------------

DegurnHaur::DegurnHaur(QStringList nameDegurn, QObject *parent)
    : modelG(nameDegurn.size(), 0, parent)
{
    NameList = nameDegurn;
    showMonth(1);
}

//----------------------замисываем данные по дату -------------------------
void DegurnHaur::setHoursDegurn(int idDegurn, QDate date, int haurs)
{

    newData(idDegurn, date.dayOfYear(), haurs);
}


//-----------------запись в модель
void DegurnHaur::newData(int degurn, int day, int data)
{
  //  qDebug() << day;
    setData(index(degurn, day), data, Qt::EditRole);
}

//--------------колонки и строки
QVariant DegurnHaur::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation == Qt::Horizontal){
        switch (role) {
        case Qt::DisplayRole:
            if(section<(_columnCount-3)) return section+1;//NameList.at(section);
            else if(section==_columnCount-3) return "Факт";
            if(section==(_columnCount-2)) return "Норма";
            if(section==(_columnCount-1)) return "Пререр";
        break; case Qt::BackgroundRole:
            if(section<(_columnCount-3)){
//                QDate _date_t = _date;
//                _date_t.setDate(_date.year(), _date.month(), section+1);
//                if(_date_t.dayOfWeek()==6 || _date_t.dayOfWeek()==7) return QBrush(QColor(255, 150, 150, 80));  // окрас выходных
//                else return QBrush(QColor(200, 200, 200, 50));
            }
        }
    }
    if(orientation == Qt::Vertical){
        switch (role) {
        case Qt::DisplayRole:
            return NameList.at(section);
        }
    }
    return QVariant();
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 15, 2020, 19:59 »

Почитай про QSortFilterProxyModel. Хотя, я бы рекомендовал тебе пересмотреть свой подход, какой-то он не правильный....
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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