alex_lip
alex_lipНаурыз 1, 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 Т.Ж.

        Спасибо.

          Пікірлер

          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
          Кіріңіз немесе Тіркеліңіз
          Г

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:66ұпай,
          • Бағалау ұпайлары-1
          t

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:33ұпай,
          • Бағалау ұпайлары-10
          t

          Qt - Тест 001. Сигналы и слоты

          • Нәтиже:52ұпай,
          • Бағалау ұпайлары-4
          Соңғы пікірлер
          G
          GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
          Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
          d
          dblas5Шілде 5, 2024, 11:02 Т.Ж.
          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssrАқп. 8, 2024, 6:43 Т.Қ.
          Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          АК
          Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
          Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          Енді форумда талқылаңыз
          Evgenii Legotckoi
          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          F
          FynjyШілде 22, 2024, 4:15 Т.Ж.
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
          BlinCT
          BlinCTМаусым 25, 2024, 1 Т.Ж.
          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
          BlinCT
          BlinCTМамыр 5, 2024, 5:46 Т.Ж.
          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
          Evgenii Legotckoi
          Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

          Бізді әлеуметтік желілерде бақылаңыз