insertRowIntoTable

Изучаем где вызывается insertRowIntoTable:

Обращаем внимание, что как следует из названия эта функция вставляет строку уже непосредственно в базу данных. Не путайте с insertRows абстрактной модели данных.

1. При стратегии редактирования OnRowChange только для режима вставки новой строки (insertIndex != -1) в функции submitAll.

2. При стратегии редактирования OnManualSubmit (только для строк кеша с признаком операции Insert) в функции submitAll.

Если insertRowIntoTable завершается успешно, то в любом случае потом вызывается select запрос к базе данных и таблица обновляется. 

Таким образом в случае вставки строки не надо опосля вызывать submit | submitAll.

Надо сказать несколько слов о функции QAbstractItemModel::insertRow, которую часто используют для вставки строки в таблицу. QAbstractItemModel::insertRow вызывает более расширенный вариант QSqlTableModel::insertRows

И вот тут надо понимать, что после insertRows  ни каких insertRowIntoTable ни при каких стратегиях редактирования не будет вызываться. То есть в базу данных физически ничего не пишется. 

Вот как выглядит функция QSqlTableModel::insertRows :

bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent)
{
    Q_D(QSqlTableModel);
    if (row < 0 || count <= 0 || row > rowCount() || parent.isValid())
        return false;

    switch (d->strategy) {
    case OnFieldChange:
    case OnRowChange:
        if (count != 1)
            return false;
        beginInsertRows(parent, row, row);
        d->insertIndex = row;
        // ### apply dangling changes...
        d->clearEditBuffer();
        emit primeInsert(row, d->editBuffer);
        break;
    case OnManualSubmit:
        beginInsertRows(parent, row, row   count - 1);
        if (!d->cache.isEmpty()) {
            QMap::Iterator it = d->cache.end();
            while (it != d->cache.begin() && (--it).key() >= row) {
                int oldKey = it.key();
                const QSqlTableModelPrivate::ModifiedRow oldValue = it.value();
                d->cache.erase(it);
                it = d->cache.insert(oldKey   count, oldValue);
            }
        }

        for (int i = 0; i < count;   i) {
            d->cache[row   i] = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Insert,
                                                                   d->rec);
            emit primeInsert(row   i, d->cache[row   i].rec);
        }
        break;
    }
    endInsertRows();
    return true;
}

Тут производится инициализация буфера редактирования строки d->editBuffer и строка помечается как новая d->insertIndex > 0.

Далее в строку мы пишем через setData все что нам надо.

При разных стратегиях редактирования потом может быть вызван submit , а может и нет.Смотрите как работает setData.

Если submit будет вызван, то тут как раз как следствие вызывается insertRowIntoTable. Правда опять с оговоркой, что хотя бы одно поле во вставляемой строки должно быть изменено (setData).

Сигнал primeInsert.

Смотрите еще : updateRowInTabledeleteRowFromTable