请教一个QTableModel在使用中的问题:有数据表table_user,使用QTableModel和QTableView来操作。
table_user的字段有:id,name,age,**,code,在界面中显示的是name,age和**,其中id为主键,code是根据name和age算的一个编码。
需求:
1、右键菜单新增一行;
2、在model提交数据库之前要计算好id值,否则插入失败;
3、在界面编辑数据内容后,鼠标点击切换不同的row,或者回车,这两个条件都需要model进行提交数据
4、code的值是根据name和age算的一个编码,在新增记录时即生成。
5、在修改现有数据时,根据修改结果自动实时计算显示关联的其它数据(需通过表修改的表内容做参数)
描述:
1、新增一行,并计算id,我是这样实现的:
//添加一行
connect(ui->action_append,&QAction::triggered,this,[=](){
QSqlRecord record = model->record();
record.setValue("unit_id",g_current_unit_id);//设置单位id
QSqlQuery qr(g_db_local);
qr.exec("select max(id) from ryb");//取出当前的最大id
if(qr.next())
{
int id = qr.value(0).toInt();
record.setValue("id",id + 1);
if(model->insertRecord(-1,record))
{
insertrow_completed = false;//设置标志位,用来做其它操作的判据
peple_row = model->rowCount()-1;//保存当前所选择的行
}
}
});
2、切换行时提交数据,我是通过响应tableview的clicked信号在实现的,代码如下:
void Form_Peple::tableview_rowchanged(QModelIndex current)
{
if(current.row() != peple_row )//换行了
{
//注意鉴别插入的空行
QSqlRecord record = model->record(current.row());
int id = record.value("id").toInt(&ok);
if(!insertrow_completed) //插入新行
{
//添加code字段值.....
record.setValue("code",12345);
//提交数据库,设置标志
if(model->submitAll())
{
insertrow_completed = true;
}
}
peple_row = current.row();//保存当前所选择的行
if(id >0)
{
emit person_changed(id);//发送人员选择更改信号,做其它运算
}
}
}
3、修改记录时,自动实时计算显示关联数据,我是在model的dataChanged信号中实现,代码如下:
void Form_Peple::do_modeldatachanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
{
int row = topLeft.row();
int column = topLeft.column();
QSqlRecord rcd = model->record(row);
peple_row = row;
QString name,date,code;
//注意鉴别是否是新插入的空行调用
if(insertrow_completed)
{
QString name= rcd.value("name").toString();
int age = rcd.value("age").toInt();
if(!(name.isEmpty() || age<0))
{
if(insertrow_completed)//如果是已存数据,需要重新计算code
{
code = 23456;
model->setData(model->index(row,1),code);//直接修改数据库
//rcd.setValue("code",code);
}
g_current_code = code;
}
//model->submitAll();
emit person_data_changed(person_id);//发送信息更改信号,做实时计算处理
}
}
我觉得上述代码可以实现,但问题是一旦运行,就会出问题,经过设置断点多次运行,发现问题出在model的信号上。当我新增一行时,这3个消息会被同时发出,要命的是,这3个消息响应函数的运行顺序是不确定的,而且可以相互中断!!!
这就导致一种可能的情况:insertrow_completed这个标志量在新插入行后还没进行设置为false时,就走到了代码段2或代码段3,此时insertrow_completed为true,就直接运行了其它代码,导致程序崩溃。
想请教大家,怎样保证这3个槽函数按照我预想的顺序执行,起码先将insertrow_completed标志位设置为false?(我试过在代码段1中的第一行就进行设置,但遇到先执行代码段2或3的情况)
另外,如果是你们,上述需求该怎么实现?
请大家不吝赐教!!!