alex_lip
alex_lip1 марта 2018 г. 7:25

Редактирование элемента QAbstractListModel

Есть модель, в которой 3 поля. 2 поля staffid, fio - не редактируются, а одно - chk - хочется редактировать через QML

Модель пытаюсь реализовать так

#ifndef MODEL_ISPOL_H
#define MODEL_ISPOL_H
#include <QAbstractListModel>
#include <QStringList>

//![0]
class Ispol
{
public:
    Ispol(const QString &staffid, const QString &fio, qint8 &chk);
//![0]

    QString staffid() const;
    QString fio() const;
    qint8 chk();

public:
    QString m_staffid;
    QString m_fio;
    qint8 m_chk;

//![1]
};

class IspolModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum IspolRoles {
        staffidRole = Qt::UserRole + 1,
        fioRole, chkRole
    };
    IspolModel(QObject *parent = 0);
//![1]

    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
  //  virtual Qt::ItemFlags flags(const QModelIndex &index) const;

    void addIspol(const Ispol &Ispol);
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    void clearIspol();

protected:
    QHash<int, QByteArray> roleNames() const;
private:
    QList<Ispol> m_Ispol;
//![2]
};
//![2]

#endif // MODEL_ISPOL_H

#include "model_ispol.h"

Ispol::Ispol(const QString &staffid, const QString &fio,  qint8 &chk)
: m_staffid(staffid), m_fio(fio), m_chk(chk)
{
}

QString Ispol::staffid() const
{
    return m_staffid;
}
QString Ispol::fio() const
{
    return m_fio;
}

qint8 Ispol::chk()
{
    return m_chk;
}

IspolModel::IspolModel(QObject *parent)
    : QAbstractListModel(parent)
{
}

void IspolModel::addIspol(const Ispol &Ispol)
{
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    m_Ispol << Ispol;
    endInsertRows();
}

void IspolModel::clearIspol()
{
    beginRemoveRows(QModelIndex(), 0, rowCount()-1);
    while (!m_Ispol.isEmpty())
    {
        m_Ispol.removeLast();
    }
    endRemoveRows();
}

int IspolModel::rowCount(const QModelIndex & parent) const {
    Q_UNUSED(parent);
    return m_Ispol.count();
}


bool IspolModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (!index.isValid()) {
        return false;
    }
const Ispol &Ispol = m_Ispol[index.row()];
    switch (role) {
    case staffidRole:
        return false;   // This property can not be set
    case fioRole:
        return false;   // This property can not be set

    case chkRole:
        Ispol.m_chk = value.toInt();
        break;
        default:
        return false;
    }

    emit dataChanged(index, index, QVector<int>() << role);

    return true;
}

//Qt::ItemFlags IspolModel::flags(const QModelIndex &index) const
//{
//    if (!index.isValid())
//        return Qt::ItemIsEnabled;

//    return QAbstractListModel::flags(index) | Qt::ItemIsEditable;
//}


QVariant IspolModel::data(const QModelIndex & index, int role) const {
    if (index.row() < 0 || index.row() >= m_Ispol.count())
        return QVariant();

    const Ispol &Ispol = m_Ispol[index.row()];
 if (role == staffidRole)
        return Ispol.staffid();
  else if (role == fioRole)
        return Ispol.fio();
 else if (role == chkRole)
       return Ispol.chk();
    return QVariant();
}

//![0]
QHash<int, QByteArray> IspolModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[staffidRole] = "staffid";
    roles[fioRole] = "fio";
    roles[chkRole] = "chk";
    return roles;
}
//![0]

Когда все было только чтение - все работало. Я попытался переопределить
bool IspolModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (!index.isValid()) {
        return false;
    }
const Ispol &Ispol = m_Ispol[index.row()];
    switch (role) {
    case staffidRole:
        return false;   // This property can not be set
    case fioRole:
        return false;   // This property can not be set

    case chkRole:
        Ispol.m_chk = value.toInt();
        break;
        default:
        return false;
    }

Ругается что 'Ispol::m_chk' in read-only object    Ispol.m_chk = value.toInt(); и
passing 'const Ispol' as 'this' argument discards qualifiers [-fpermissive] return Ispol.chk();
in call to 'qint8 Ispol::chk()'qint8 Ispol::chk()




Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 1 марта 2018 г. 7:28

Потому, что Вы определили эту ссылку как константную.

const Ispol &Ispol
Правильно будет убрать const
Ispol &Ispol
Подробнее о константах
    alex_lip
    • 1 марта 2018 г. 7:58

    теперь ругается здесь

    QVariant IspolModel::data(const QModelIndex & index, int role) const {
        if (index.row() < 0 || index.row() >= m_Ispol.count())
            return QVariant();
    
         Ispol &Ispol = m_Ispol[index.row()];
     if (role == staffidRole)
            return Ispol.staffid();
      else if (role == fioRole)
            return Ispol.fio();
     else if (role == chkRole)
           return Ispol.chk();
        return QVariant();
    }

    ошибка: binding 'const Ispol' to reference of type 'Ispol&' discards qualifiers
    Ispol &Ispol = m_Ispol[index.row()];
    ^




      Evgenii Legotckoi
      • 1 марта 2018 г. 8:05

      Ну вот смотрите, у вас есть методы с const на конце и без const на конце. В зависимости от этого, они могут изменять данные, или не могут.

      соответсвенно, если есть в методе const на конце, то некоторые переменные потребуют const, внутри методов, а некоторые нет.

      Полагаю, что в setData вам не нужен const, а в data нужен.
        alex_lip
        • 1 марта 2018 г. 8:06

        Спасибо.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          AD

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:50баллов,
          • Очки рейтинга-4
          m
          • molni99
          • 26 октября 2024 г. 11:37

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:80баллов,
          • Очки рейтинга4
          m
          • molni99
          • 26 октября 2024 г. 11:29

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:20баллов,
          • Очки рейтинга-10
          Последние комментарии
          i
          innorwall14 ноября 2024 г. 22:42
          Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
          i
          innorwall14 ноября 2024 г. 20:09
          Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
          i
          innorwall14 ноября 2024 г. 15:05
          EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
          i
          innorwall14 ноября 2024 г. 15:00
          PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
          Сейчас обсуждают на форуме
          i
          innorwall14 ноября 2024 г. 14:39
          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
          i
          innorwall11 ноября 2024 г. 21:55
          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
          9
          9Anonim25 октября 2024 г. 19:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
          ИМ
          Игорь Максимов3 октября 2024 г. 14:05
          Реализация навигации по разделам Спасибо Евгений!

          Следите за нами в социальных сетях