【Qt】在表格QTableWidget或者QTableView中,当主键Id存在时更新数据,不存在时添加数据解决方案

问题

有时在开发中,表格需要显示数据,每一行呢,需要记录对应的id。

当更新表格数据时,会根据id进行更新,id存在就更新行数据,不存在就添加一行新数据。

解决方案

如何知道id存在还是不存在呢?如果每次都获取表格的全部数据进行查找,虽然功能可以实现,但未免效率有些低。

因为id是唯一的,所以可以选择一个中间结构,添加Map数据结构,这样查找起来就会很方便。
.h

cpp 复制代码
QMap<QString, QStandardItem*>   m_mapItem; // 记录已存在的数据

.cpp

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:

当改变第一行数据时:

当更新或者添加数据时:

如此,问题解决。

结论

对于今天解决不了的事情,也不必着急。因为明天还是解决不了

相关推荐
四维碎片几秒前
【Qt】UDP跨平台调试工具
qt·学习·udp
jasligea18 分钟前
构建个人智能助手
开发语言·python·自然语言处理
kokunka22 分钟前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
踏过山河,踏过海1 小时前
【用ui文件做个简单工具的开发,为什么修改完ui后,程序重新编译运行后,GUI界面还是不变呢?】
qt·ui
云栖梦泽1 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化
开发语言
java1234_小锋1 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525542 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
福大大架构师每日一题2 小时前
ComfyUI v0.11.1正式发布:新增开发者专属节点支持、API节点强化、Python 3.14兼容性更新等全方位优化!
开发语言·python
wangdaoyin20102 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript