Вставка строки в 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
, но он всегда содержит только пустую строку. Так же и сообщение об ошибке, которое я печатаю
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();
}
}
По следующей ссылке вы найдете пример.