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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Редактирование в QAbstractTableModel не работает  (Прочитано 5370 раз)
ubihinon
Гость
« : Ноябрь 16, 2015, 13:21 »

Здраствуйте!
По клику на ячейку появляется текстовое поле, но когда данные отредактированы, появляется старое значение.
Как сделать, чтобы после редактирования появлялось новое отредактированное значение в ячейках?

PersonItemModel.h:
Код:
#include <QObject>
#include <QAbstractTableModel>
#include "person.h"
 
class PersonItemModel : public QAbstractTableModel
{
public:
    PersonItemModel(QList<Person> persons, QObject *parent = 0);
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
    Qt::ItemFlags flags(const QModelIndex & index) const;
private:
    QStringList headers;
    QList<Person> persons;
signals:
 
public slots:
};

PersonItemModel.cpp:
Код:
#include "personitemmodel.h"
 
PersonItemModel::PersonItemModel(QList<Person> persons, QObject */*parent*/)
{
    this->persons = persons;
    headers << "Фамилия" << "Имя" << "Отчество" << "Пол" << "Дата рождения"
             << "Место работы"<< "Телефон";
}
 
int PersonItemModel::rowCount(const QModelIndex &/*parent*/) const
{
    return persons.size();
}
 
int PersonItemModel::columnCount(const QModelIndex &/*parent*/) const
{
    return 7;
}
 
QVariant PersonItemModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Horizontal)
    {
        if( role == Qt::DisplayRole)
        {
            return headers.at(section);
        }
    }
    else
    {
        if( role == Qt::DisplayRole)
        {
            return section + 1;
        }
    }
    return QVariant();
}
 
QVariant PersonItemModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
    {
        return QVariant();
    }
    if(role == Qt::DisplayRole || role == Qt::EditRole)
    {
        return persons.at(index.row()).getElement(index.column());
    }
    else
    {
        return QVariant();
    }
}
 
bool PersonItemModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if(index.isValid() && role == Qt::EditRole)
    {
        persons.value(index.row()).setElement(index.column(), value.toString());
        emit dataChanged(index, index);
        return true;
    }
    return false;
}
 
Qt::ItemFlags PersonItemModel::flags(const QModelIndex & index) const
{
    return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}

Person.h:
Код:
#include <QString>
#include <QVariant>
class Person
{
public:
    Person();
    int getId() const;
    void setId(int value);
 
    bool save();
 
    QVariant getElement(int element) const;
    void setElement(int element, QVariant value);
 
    QString getSurname() const;
    void setSurname(const QString &value);
 
    QString getName() const;
    void setName(const QString &value);
 
    QString getPatronymic() const;
    void setPatronymic(const QString &value);
 
    bool getSex() const;
    void setSex(bool value);
 
    QString getPlaceOfWork() const;
    void setPlaceOfWork(const QString &value);
 
    QString getDataOfBirth() const;
    void setDataOfBirth(const QString &value);
 
    QString getPhoneNumber() const;
    void setPhoneNumber(const QString &value);
 
private:
    int id;
    QString surname;
    QString name;
    QString patronymic;
    bool sex;
    QString dataOfBirth;
    QString placeOfWork;
    QString phoneNumber;
 
};

Person.cpp:
Код:
#include "person.h"
#include "db.h"
#include <QVariant>
Person::Person()
{
}
 
bool Person::save()
{
    Db db;
    db.addPerson(this);
    return true;
}
 
QVariant Person::getElement(int element) const
{
    switch(element)
    {
        case 0:
            return surname;
        case 1:
            return name;
        case 2:
            return patronymic;
        case 3:
            return sex;
        case 4:
            return dataOfBirth;
        case 5:
            return placeOfWork;
        case 6:
            return phoneNumber;
    }
}
 
void Person::setElement(int element, QVariant value)
{
    switch(element)
    {
        case 0:
            surname = value.toString();
            break;
        case 1:
            name = value.toString();
            break;
        case 2:
            patronymic = value.toString();
            break;
        case 3:
            sex = value.toBool();
            break;
        case 4:
            dataOfBirth = value.toString();
            break;
        case 5:
            placeOfWork = value.toString();
            break;
        case 6:
            phoneNumber = value.toString();
            break;
 
    }
}
 
int Person::getId() const
{
    return id;
}
 
void Person::setId(int value)
{
    id = value;
}
 
QString Person::getSurname() const
{
    return surname;
}
 
void Person::setSurname(const QString &value)
{
    surname = value;
}
 
QString Person::getName() const
{
    return name;
}
 
void Person::setName(const QString &value)
{
    name = value;
}
 
QString Person::getPatronymic() const
{
    return patronymic;
}
 
void Person::setPatronymic(const QString &value)
{
    patronymic = value;
}
 
bool Person::getSex() const
{
    return sex;
}
 
void Person::setSex(bool value)
{
    sex = value;
}
 
QString Person::getPlaceOfWork() const
{
    return placeOfWork;
}
 
void Person::setPlaceOfWork(const QString &value)
{
    placeOfWork = value;
}
 
QString Person::getDataOfBirth() const
{
    return dataOfBirth;
}
 
void Person::setDataOfBirth(const QString &value)
{
    dataOfBirth = value;
}
 
QString Person::getPhoneNumber() const
{
    return phoneNumber;
}
 
void Person::setPhoneNumber(const QString &value)
{
    phoneNumber = value;
}

MainWindow.cpp:
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Db db;
    persons = db.selectPersons();
    model = new PersonItemModel(persons, this);
    ui->personTableView->setModel(model);
    ui->personTableView->setEditTriggers(QAbstractItemView::DoubleClicked);
 
}
Записан
UVV
Гость
« Ответ #1 : Ноябрь 16, 2015, 13:41 »

Код:
...
persons.value(index.row()).setElement(index.column(), value.toString());
...
Эта строка не обновляет элемент списка.
Записан
ubihinon
Гость
« Ответ #2 : Ноябрь 16, 2015, 13:49 »

Код:
...
persons.value(index.row()).setElement(index.column(), value.toString());
...
Эта строка не обновляет элемент списка.
Тогда как обновить элемент списка?
Записан
UVV
Гость
« Ответ #3 : Ноябрь 16, 2015, 14:01 »

Код:
Person updatedPerson = persons.value(index.row());
updatedPerson.setElement(index.column(), value.toString())
persons.replace(index.row(), updatedPerson);

Статья для ознакомления, почему так происходит http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #4 : Ноябрь 16, 2015, 14:03 »

Можно проще
Код:
persons[index.row()].setElement(index.column(), value.toString());

Код:
QList
T value(int i) const
T & operator[](int i)
Записан
UVV
Гость
« Ответ #5 : Ноябрь 16, 2015, 14:07 »

Кстати да, так тоже должно работать =)
Записан
ubihinon
Гость
« Ответ #6 : Ноябрь 16, 2015, 15:12 »

Можно проще
Код:
persons[index.row()].setElement(index.column(), value.toString());

Заработало)) большое спасибо)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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