关于QDataWidgetMapper
今天继续改进师兄的程序,使用QDataWidgetMapper,主要是实现窗体中可以编辑的窗口和QSqlTableModel的关联。
主要有3个步骤:
1、创建 QDataWidgetMapper 对象
2、关联 model
3、关联 widgets,并创建其与model中section的映射
但是在使用的时候总是有问题,最后发现是多了一句。
部分代码如下:
addmodel=new QSqlTableModel(this);
addmodel->setTable(tr("cankao"));
//addmodel->setSort(Database_ID, Qt::AscendingOrder);
//addmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);//多的那一句,耽误了我好久的时间
addmodel->select();
//1.创建 QDataWidgetMapper 对象
mapper = new QDataWidgetMapper(this);
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
//2.关联 model
mapper->setModel(addmodel);
//3、关联 widgets,并创建其与model中section的映射
mapper->addMapping(ui->le_name, Database_Name);
mapper->addMapping(ui->le_kind, Database_Kind);
mapper->addMapping(ui->le_nd, Database_Nd);
mapper->addMapping(ui->le_wd, Database_Wd);
mapper->addMapping(ui->le_sd, Database_Sd);
mapper->addMapping(ui->le_ls, Database_Ls);
mapper->addMapping(ui->le_sj, Database_Time);
mapper->addMapping(ui->le_cbm, Database_Cbm);
另外,参照《C++ GUI Qt4编程》重写了done
void ADDRECORD::done(int result)
{
//将在窗体进行的更改返回给模型
bool ok3;
ok3=mapper->submit();//Submits all changes from the mapped widgets to the model.
if(!ok3)
{
addmodel->database().rollback();//database().rollback(); //回滚
QMessageBox::warning(this,tr("tableModel"),
tr("数据库错误:%1").arg(addmodel->lastError().text()));
}
//关闭对话框,并设置返回result。
QDialog::done(result);
}
给数据库添加一条记录的代码
void ADDRECORD::on_pb_tj_clicked()
{
int row = mapper->currentIndex();//重新找回当前行
mapper->submit();
bool ok;
ok=addmodel->insertRow(row);//插入行
mapper->setCurrentIndex(row);
ui->le_name->setFocus();
}