问题
有时在开发中,表格需要显示数据,每一行呢,需要记录对应的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:
当改变第一行数据时:
当更新或者添加数据时:
如此,问题解决。
结论
对于今天解决不了的事情,也不必着急。因为明天还是解决不了
。