【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:

当改变第一行数据时:

当更新或者添加数据时:

如此,问题解决。

结论

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

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript