问题
有时在开发中,表格需要显示数据,每一行呢,需要记录对应的id。
当更新表格数据时,会根据id进行更新,id存在就更新行数据,不存在就添加一行新数据。
解决方案
如何知道id存在还是不存在呢?如果每次都获取表格的全部数据进行查找,虽然功能可以实现,但未免效率有些低。
因为id是唯一的,所以可以选择一个中间结构,添加Map数据结构,这样查找起来就会很方便。
.h
QMap<QString, QStandardItem*> m_mapItem; // 记录已存在的数据
.cpp
// 首先,初始化数据qsrand(0); // 随机数QStandardItemModel* pModel = new QStandardItemModel;for(int i = 0; i < 5; ++i){QString strId = QString("uuid_%1").arg(i);pModel->setItem(i, 0, new QStandardItem(strId));pModel->setItem(i, 1, new QStandardItem(QString("%1_%2").arg(QString::number(i), QString::number(1))));pModel->setItem(i, 2, new QStandardItem(QString("%1_%2").arg(QString::number(i), QString::number(2))));pModel->setItem(i, 3, new QStandardItem(QString("%1_%2").arg(QString::number(i), QString::number(3))));// 将数据添加到容器中m_mapItem.insert(strId, pModel->item(i, 0));}ui->tableView->setModel(pModel);// 添加或者更新数据,当id存在更新,当id不存在时添加数据QStandardItemModel* pModel = static_cast<QStandardItemModel*>(ui->tableView->model());int n = qrand()%100 +1;QString strUuid = QString("uuid_%1").arg(n);if(m_mapItem.contains(strUuid)) // 查找,存在就更新{QStandardItem* pItem = m_mapItem.value(strUuid);int nRow = pItem->row();pModel->setItem(nRow, 1, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));pModel->setItem(nRow, 2, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));pModel->setItem(nRow, 3, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));return;}// 不存在就添加int nRowCount = pModel->rowCount();pModel->insertRow(nRowCount);pModel->setItem(nRowCount, 0, new QStandardItem(QString("%1").arg(strUuid)));pModel->setItem(nRowCount, 1, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));pModel->setItem(nRowCount, 2, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));pModel->setItem(nRowCount, 3, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));m_mapItem.insert(strUuid, pModel->item(nRowCount, 0));// 更新第一行数据QStandardItemModel* pModel = static_cast<QStandardItemModel*>(ui->tableView->model());int n = qrand()%100 +1;QString strUuid = QString("uuid_%1").arg(0);if(m_mapItem.contains(strUuid)){QStandardItem* pItem = m_mapItem.value(strUuid);int nRow = pItem->row();pModel->setItem(nRow, 1, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));pModel->setItem(nRow, 2, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));pModel->setItem(nRow, 3, new QStandardItem(QString("%1_%2").arg(QString::number(nRow), QString::number(n))));return;}int nRowCount = pModel->rowCount();pModel->insertRow(nRowCount);pModel->setItem(nRowCount, 0, new QStandardItem(QString("%1").arg(strUuid)));pModel->setItem(nRowCount, 1, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));pModel->setItem(nRowCount, 2, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));pModel->setItem(nRowCount, 3, new QStandardItem(QString("%1_%2").arg(QString::number(nRowCount), QString::number(n))));
效果
默认ui:
当改变第一行数据时:
当更新或者添加数据时:
如此,问题解决。
结论
对于今天解决不了的事情,也不必着急。因为明天还是解决不了
。