Bootstrap

QStandardItemModel使用技巧

一张表创建多个对应的QStandardItemModel

QTableView表格控件和QStandardItemModel配套使用,实现了数据与显示的隔离。其中QStandardItemModel记录表格数据。
实际项目中经常遇到多级表格数据显示的问题。即:表A的一行内容关联整张表B,表B的内容关联整张表C。表A行切换时,需重新刷新表B及表C的内容。每次都查询数据库写入Model比较麻烦。可以创建多个Model,保存相应要切换的数据。

//创建model
QStandardItemModel* model = new QStandardItemModel(ui->tableViewBasketPackage);
model->setColumnCount(4);
model->setHeaderData(0,Qt::Horizontal,QStringLiteral("包类型"));
model->setHeaderData(1,Qt::Horizontal,QStringLiteral("包类别"));
model->setHeaderData(2,Qt::Horizontal,QStringLiteral("外包装"));
model->setHeaderData(3,Qt::Horizontal,QStringLiteral("数量"));
//Model存入Hash表 
m_basketPackageModelHash.insert(basketid,model);

显示时根据basketid查询到Model即可快速刷新表B

	int64_t basketId = item->data(ROWID_ROLE).toLongLong();
    if(m_basketPackageModelHash.contains(basketId))
    {
        ui->tableViewBasketPackage->setModel(m_basketPackageModelHash.value(basketId));
        m_curBasketPackageModel = m_basketPackageModelHash.value(basketId);
    }

QStandardItem的使用

以上方法能记录表B的内容,那第三级表C的数据如何存储呢?
这时就要借助QStandardItem的setData()功能了。它有2个参数const QVariant &value, int role 。
其中role的不同,标识一个Item可保存多个value。
QVariant是个神奇的类,它能记录int、Qtring、各种自定义的结构体。当然它也能记录QStandardItemModel*。
要记录第三级表的数据也是保存在QStandardItemModel*中,再把Model的指针以第二级表B中Item的Data保存下来。

	//第二级表每行循环都会创建一个器械model
    QStandardItemModel* instModel = new QStandardItemModel(ui->tableViewInstruments);
    instModel->setColumnCount(2);
    instModel->setHeaderData(0,Qt::Horizontal,QStringLiteral("器械类型"));
    instModel->setHeaderData(1,Qt::Horizontal,QStringLiteral("数量"));

    QVariant instV;
    instV.setValue(instModel);
    item->setData(instV,INSTRUMENT_ROLE); //此Item是第二级表model的一个数据项

展示时直接从Item中取出Model即可

//取出Item的data
QStandardItem* item = m_curBasketPackageModel->item(row,0);
QStandardItemModel* instModel = item->data(INSTRUMENT_ROLE).value<QStandardItemModel*>();
if(instModel){
    ui->tableViewInstruments->setModel(instModel);
}

结尾

本方式适用于小数据量,多张表有级联关系,需要快速切换。这种方式还能实现第二第三级数据的缓存记录。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;