vr
23rd May 2007, 19:52
Hi,
in my app. i use a qtableview with a qsqlrelationaltablemodel. User can not edit data directly in the view but via a "form" below the view. For example the "foreign" fields can be set using a ComboBox (just as if i would use the view's delegate).
The model is set to OnManualSumbit mode, so on update first i call setRecord and than submitAll(). And submitAll drops an error - incorrect integer value: "theselectedforeignname" for column groupid.
Here's two pieces of code:
[Init]
mView = new QTableView;
mRelationalModel = new SqlRelationalTableModel(this,QSqlDatabase::databas e());
mRelationalModel->setTable("table");
mRelationalModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
mRelationalModel->setRelation(5, QSqlRelation("othertable","id","name"));
if ( ! mRelationalModel->select() ) {
QMessageBox::information(this,"Error",mRelationalModel->lastError().text());
return false;
}
mView->setModel(mRelationalModel);
mView->setItemDelegate(new QSqlRelationalDelegate(mView));
mView->setSelectionBehavior(QAbstractItemView::SelectRows );
mView->setSelectionMode(QAbstractItemView::SingleSelectio n);
mView->setEditTriggers(QAbstractItemView::NoEditTriggers) ;
mView->setSortingEnabled(true);
mView->sortByColumn(0,Qt::AscendingOrder);
mView->verticalHeader()->hide();
mView->show();
[The update code]
if ( ! mView->currentIndex().isValid() ) return;
int row = mView->currentIndex().row();
QSqlRecord record = mRelationalModel->record(row);
record.setValue("field1",field1Editor->text());
record.setValue("field2",field2Editor->text());
//more fields....
//and this is the foreign field
record.setValue("name",foreignfieldCombo->currentText());
if ( mRelationalModel->setRecord(row, record) ) {
//on second try this two lines were added and record.setValue("name"...was commented out
//QModelIndex idx = mRelationalModel->index(row,5);
//mRelationalModel->setData(idx, foreignfieldCombo->currentText(), Qt::EditRole);
if ( ! mRelationalModel->submitAll() ) {
QMessageBox::critical(this, "Error", mRelationalModel->lastError().text());
mRelationalModel->revertRow(row);
}
}
As you can see i tried to set foreign data with record.setValue and also with this two lines of code:
QModelIndex idx = mRelationalModel->index(row,5);
mRelationalModel->setData(idx, foreignfieldCombo->currentText(), Qt::EditRole);
The first method did nothing and submitAll returned false
The second method can succesfully update the foreign field data in the view, but submitAll still couldn't write record back to db.
So, how should i do this correctly?
Should i "translate" the selected name into the corresponding id value myself?
Thanks:
vr
in my app. i use a qtableview with a qsqlrelationaltablemodel. User can not edit data directly in the view but via a "form" below the view. For example the "foreign" fields can be set using a ComboBox (just as if i would use the view's delegate).
The model is set to OnManualSumbit mode, so on update first i call setRecord and than submitAll(). And submitAll drops an error - incorrect integer value: "theselectedforeignname" for column groupid.
Here's two pieces of code:
[Init]
mView = new QTableView;
mRelationalModel = new SqlRelationalTableModel(this,QSqlDatabase::databas e());
mRelationalModel->setTable("table");
mRelationalModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
mRelationalModel->setRelation(5, QSqlRelation("othertable","id","name"));
if ( ! mRelationalModel->select() ) {
QMessageBox::information(this,"Error",mRelationalModel->lastError().text());
return false;
}
mView->setModel(mRelationalModel);
mView->setItemDelegate(new QSqlRelationalDelegate(mView));
mView->setSelectionBehavior(QAbstractItemView::SelectRows );
mView->setSelectionMode(QAbstractItemView::SingleSelectio n);
mView->setEditTriggers(QAbstractItemView::NoEditTriggers) ;
mView->setSortingEnabled(true);
mView->sortByColumn(0,Qt::AscendingOrder);
mView->verticalHeader()->hide();
mView->show();
[The update code]
if ( ! mView->currentIndex().isValid() ) return;
int row = mView->currentIndex().row();
QSqlRecord record = mRelationalModel->record(row);
record.setValue("field1",field1Editor->text());
record.setValue("field2",field2Editor->text());
//more fields....
//and this is the foreign field
record.setValue("name",foreignfieldCombo->currentText());
if ( mRelationalModel->setRecord(row, record) ) {
//on second try this two lines were added and record.setValue("name"...was commented out
//QModelIndex idx = mRelationalModel->index(row,5);
//mRelationalModel->setData(idx, foreignfieldCombo->currentText(), Qt::EditRole);
if ( ! mRelationalModel->submitAll() ) {
QMessageBox::critical(this, "Error", mRelationalModel->lastError().text());
mRelationalModel->revertRow(row);
}
}
As you can see i tried to set foreign data with record.setValue and also with this two lines of code:
QModelIndex idx = mRelationalModel->index(row,5);
mRelationalModel->setData(idx, foreignfieldCombo->currentText(), Qt::EditRole);
The first method did nothing and submitAll returned false
The second method can succesfully update the foreign field data in the view, but submitAll still couldn't write record back to db.
So, how should i do this correctly?
Should i "translate" the selected name into the corresponding id value myself?
Thanks:
vr