|
10Qter豆
本帖最后由 clickto 于 2018-5-24 00:43 编辑
请教一个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的情况)
另外,如果是你们,上述需求该怎么实现?
请大家不吝赐教!!!
|
|