• 2406阅读
  • 0回复

[提问]请教一个QSqlTableModel使用的问题 [复制链接]

上一主题 下一主题
离线clickto
 

只看楼主 倒序阅读 楼主  发表于: 2018-05-24
请教一个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的情况)
另外,如果是你们,上述需求该怎么实现?
请大家不吝赐教!!!

快速回复
限100 字节
 
上一个 下一个