Название: Редактирование в QAbstractTableModel не работает
Отправлено: 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); }
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: UVV от Ноябрь 16, 2015, 13:41
... persons.value(index.row()).setElement(index.column(), value.toString()); ...
Эта строка не обновляет элемент списка.
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: ubihinon от Ноябрь 16, 2015, 13:49
... persons.value(index.row()).setElement(index.column(), value.toString()); ...
Эта строка не обновляет элемент списка. Тогда как обновить элемент списка?
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: UVV от Ноябрь 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/
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: Swa от Ноябрь 16, 2015, 14:03
Можно проще persons[index.row()].setElement(index.column(), value.toString()); QList T value(int i) const T & operator[](int i)
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: UVV от Ноябрь 16, 2015, 14:07
Кстати да, так тоже должно работать =)
Название: Re: Редактирование в QAbstractTableModel не работает
Отправлено: ubihinon от Ноябрь 16, 2015, 15:12
Можно проще persons[index.row()].setElement(index.column(), value.toString()); Заработало)) большое спасибо)))
|