我特地写了一个测试程序来查找原因。 测试程序
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 给出一个错误,指出没有任何内容可以添加到数据库中。(错误模型行:33“没有要更新的字段”)
现在让我们创建重写的方法及其实现
// 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 的错误,因为这些标志与视图相关联,而不是与数据库相关联。也许有人遇到过,看看?当然你可以通过添加它
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 中的模型,而且还不止于此