alex_lip
alex_lip01 березня 2018 р. 07: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
  • 01 березня 2018 р. 07:28

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

const Ispol &Ispol
Правильно будет убрать const
Ispol &Ispol
Подробнее о константах
    alex_lip
    • 01 березня 2018 р. 07: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
      • 01 березня 2018 р. 08:05

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

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

      Полагаю, что в setData вам не нужен const, а в data нужен.
        alex_lip
        • 01 березня 2018 р. 08:06

        Спасибо.

          Коментарі

          Only authorized users can post comments.
          Please, Log in or Sign up
          AD

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

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

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

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

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

          • Результат:20бали,
          • Рейтинг балів-10
          Останні коментарі
          ИМ
          Игорь Максимов22 листопада 2024 р. 11:51
          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii Legotckoi31 жовтня 2024 р. 14:37
          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZE19 жовтня 2024 р. 08:19
          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь Максимов05 жовтня 2024 р. 07:51
          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas505 липня 2024 р. 11:02
          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Тепер обговоріть на форумі
          Evgenii Legotckoi
          Evgenii Legotckoi24 червня 2024 р. 15:11
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          t
          tonypeachey115 листопада 2024 р. 06:04
          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
          NSProject
          NSProject04 червня 2022 р. 03:49
          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
          9
          9Anonim25 жовтня 2024 р. 09:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Слідкуйте за нами в соціальних мережах