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 шт):

Автор решения: needKVAS

Это не баг.

Ваше переопределение метода 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;
}

Уточню, что данная реализация не всегда будет корректна (например, после удаления строки).

→ Ссылка