QSqlTableModel не добавляет данные если переопределить flags
Специально написал тестовую прогу чтобы найти причину. тестовая прога
class Abonent_Model : public QSqlTableModel
bool Abonent_Model::add_model_abonent(const QString &nick_name, const QByteArray & hash, const QString & avatar)
{
//qDebug() << "m_model->tableName() = " << m_model->tableName();
// m_qdb.transaction();
QSqlRecord record = this->record();
// record.clear();
record.setValue("nick_name", nick_name);
record.setValue("hash_abonent", hash);
record.setValue("last_date_time", QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm"));
record.setValue("avatar", avatar);
if(this->insertRecord(-1, record)) //add to model
{
if (!this->submitAll()) //add to base_data
{
qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
this->revertAll();
return false;
}
return true;
}
else //TODO db & rollback
{
qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
this->database().rollback();
}
return false;
}
И submitAll выдает ошибку мол не чего добавлять в базу. (Error model line: 33 "No Fields to update")
Теперь заремим переопределенный метод и его реализацию
// protected:
// Qt::ItemFlags flags(const QModelIndex &index) const;
//Qt::ItemFlags Abonent_Model::flags(const QModelIndex &index) const
//{
// if(!index.isValid())
// return Qt::ItemIsEnabled;
// return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
//}
и теперь все прекрасно добавляется, это походу баг QSqlTableModel, так как эти flags связаны с представлением , а не с базой. Может кто сталкивался гляньте ? Конечно можно добавить через
SqlQuery query(m_qdb);
ok = query.exec("insert into abonents values('nick1', '111111111', '2.02.2024 02:01', '')");
if(!ok)
{
qDebug() << __LINE__ << "query.exec" << query.lastError().text();
}
Но это так не устраивает , тогда лучше использовать libsqlite и свою модель от QAbstractItemModel , а не это вот все
Ответы (1 шт):
Это не баг.
Ваше переопределение метода flags для любого индекса утверждает, что данный индекс нередактируемый.
Добавление строк в таблицу начинается с добавления строк в модель. Далее новые значения кэшируются методом setData, который ничего не делает для нередактируемых индексов. Вы можете убедиться в данном поведении если закомментируете строку this->revertAll();. Так вы увидите, что в вашу модель просто добавилось две пустые строки.
Чтобы ваш пример заработал достаточно просто написать так:
Qt::ItemFlags Abonent_Model::flags(const QModelIndex &index) const
{
if(!index.isValid())
return Qt::ItemIsEnabled;
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}
Уточню, что данная реализация не всегда будет корректна (например, после удаления строки).