Здраствуйте!
По клику на ячейку появляется текстовое поле, но когда данные отредактированы, появляется старое значение.
Как сделать, чтобы после редактирования появлялось новое отредактированное значение в ячейках?
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);
}