Вставка строки в QSqlTableModel

Когда строку нужно отредактировать, в диалог редактирования передается индекс.
Редактирование работает нормально.
Когда я хочу добавить строку, я не передаю индекс конструктору диалога, поэтому он знает, что должен добавить новую строку.
Вот код функции, реагирующей на кнопки диалога

void DialogAddCl::on_buttonBox_clicked(QAbstractButton *button)
{
    // prepare
    m->database().transaction();
    QString debugstr;
    auto chi4 = ui->buttonBox->buttonRole(button);
    int rowCount = m->rowCount();
    switch (chi4) {
    case QDialogButtonBox::AcceptRole:
        if (!ind->isValid())
            // insert
            if (!m->insertRow(rowCount, *ind))
            {
                QMessageBox::critical (this, "Error inserting into model", m->lastError().text(), QMessageBox::Cancel);
                break;
            }
            else
            {
                m->setData(m->index(rowCount, 0), rowCount+1);
            }
        else
        {
            // update
            rowCount = ind->row();
        }
        m->setData(m->index(rowCount, 1), ui->name->text());
        m->setData(m->index(rowCount, 2), ui->addr->text());
        // 12 other setData() calls

        if (m->submitAll())
        {
            m->database().commit();
        }
        else
        {
            // rollback if error
            m->database().rollback();
            debugstr = QString(m->database().lastError().text());
            QMessageBox::critical (this, "Database returned an error",
                                   m->database().lastError().text(), QMessageBox::Cancel);
        }
    case QDialogButtonBox::RejectRole:
        this->close();
        break;
    case QDialogButtonBox::ResetRole:
        fillFields();
        break;
    default:
        break;
    }

}

Вот кусок dialogaddcl.h:

private:
    Ui::DialogAddCl *ui;
    QSqlTableModel* m;
    QModelIndex* ind;

Таким образом, m->submitAll() отлично работает, если я редактирую существующую запись, и терпит неудачу, если я пытаюсь отправить только что вставленную строку. Я проверил с помощью отладки, вызовы setData() работают нормально даже при добавлении, так что это не БД ожидает NOT NULL полей и выдает ошибку.
Кстати, может быть, кто-нибудь может указать метод, чтобы поймать фактический текст ошибки? Я пробовал с debugstr, но он всегда содержит только пустую строку. Как и сообщение об ошибке, которое я печатаю


person mekkanizer    schedule 15.11.2017    source источник


Ответы (1)


Чтобы вставить строку в QSqlTableModel, вы не должны использовать setData() напрямую, если вы не должны использовать insertRecord(), где вы указываете строку и QSqlRecord. QSqlRecord можно получить с помощью метода record() модели.

InsertDialog dial;
if(dial.exec()== InsertDialog::Accepted){
    db.transaction();
    QString f = dial.firstname();
    QString l = dial.lastname();

    QSqlRecord record = model.record();
    /* since the id field has the autoincrement attribute,
     * it is not necessary to indicate its value,
     * that is because this field of the request is removed.
    */
    record.remove(record.indexOf("id"))
    record.setValue("firstname", f);
    record.setValue("lastname", l);
    /*-1 is set to indicate that it will be added to the last row*/
    if(model.insertRecord(-1, record)){
        qDebug()<<"successful insertion";
        model->submitAll();
    }
    else{
        db.rollback();
    }
}

По следующей ссылке вы найдете пример.< / суп>

person eyllanesc    schedule 16.11.2017
comment
подождите, но я не использовал setData для вставки, я использовал его для установки значений в только что вставленной строке. Я вызываю insertRow перед setData - person mekkanizer; 16.11.2017
comment
однако, если невозможно использовать insertRow(s), я полностью принимаю это. Просто дайте любую ссылку, чтобы доказать это, и я переключусь на использование insertRecord - person mekkanizer; 16.11.2017
comment
Это то, что вам не нужно использовать setData, а не insertRow, вам просто нужно использовать insertRecord, этот метод вызывает предыдущие внутри. - person eyllanesc; 16.11.2017
comment
Я вижу сейчас. Однако мне не нужно удалять идентификатор, поскольку он не увеличивается автоматически. Я поменяю эту деталь. Спасибо за разъяснение того, что-звонит-что - person mekkanizer; 16.11.2017
comment
@mekkanizer Хорошо, в моем случае, если бы я это сделал, это был бы просто плюс. :П - person eyllanesc; 16.11.2017
comment
Не забудьте отправить: if(model.insertRecord(-1, record)){ model->submitAll(); }, иначе изменения не сохранятся. - person qed; 18.07.2018