在上一篇文章 - QTableView效率优化2中https://blog.csdn.net/qq_37996632/article/details/123551325?spm=1001.2014.3001.5501,继承QAbstractTableModel自定义了一个简陋的table model,虽然能快速加载出10w,100w级别的数据,但是本身并没有任何接口。想要这个model正常使用,一般来说还需要加上这么几个接口:

  • setItemText() - 为指定的单元格(QModelIndex/row,column)设置文字;
  • itemText() - 获取指定的单元格(QModelIndex/row,column)的文字;
  • setItemData() - 为指定的单元格(QModelIndex/row,column)设置data(QVariant);
  • itemData() - 获取指定的单元格(QModelIndex/row,column)的data(QVariant);
  • setHignlightIndex() - 为指定的单元格设置背景色;
  • clear() - 清空model中的所有数据

以及信号:

  • itemChanged(const QModelIndex &index, const QVariant &value);

nari_tableitemmodel.h

#ifndef NARI_TABLEITEMMODEL_H
#define NARI_TABLEITEMMODEL_H#include <QAbstractTableModel>
#include <QObject>
#include <QStringList>
#include <QVector>class NARI_TableItemModel : public QAbstractTableModel
{Q_OBJECT
public:explicit NARI_TableItemModel(QObject *parent = NULL);~NARI_TableItemModel();void SetData(const QVariantMap &map);void setHignlightIndex(QVector< QPair<int, int> > vec_index);virtual Qt::ItemFlags flags(const QModelIndex &index) const;virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;virtual int rowCount(const QModelIndex &parent) const;virtual int columnCount(const QModelIndex &parent) const;virtual QVariant data(const QModelIndex &index, int role) const;virtual bool setData(const QModelIndex &index, const QVariant &value, int role);QString itemText(int row, int column) const;QString itemText(const QModelIndex &index) const;void setItemText(const QModelIndex &index, const QString &str);void setItemText(int row, int column, const QString &str);QVariant ItemData(const QModelIndex &index) const;QVariant ItemData(int row, int column) const;void SetItemData(const QModelIndex &index, const QVariant &data);void SetItemData(int row, int column, const QVariant &data);void clear();signals:void itemChanged(const QModelIndex &index, const QVariant &value);private:QStringList m_hor_hedlbls;                      // headerlabelsQStringList m_vec_hedlbls;                      // oids - map.keys()QVariantMap m_table_map, m_data_map;QVector<QPair<int, int> > m_highlight_indexs;   // 背景高亮的indexs
};#endif // NARI_TABLEITEMMODEL_H

nari_tableitemmodel.cpp

#include "nari_tableitemmodel.h"#include <QDebug>
#include <QColor>
#include <QIcon>NARI_TableItemModel::NARI_TableItemModel(QObject *parent): QAbstractTableModel(parent)
{
}NARI_TableItemModel::~NARI_TableItemModel()
{
}void NARI_TableItemModel::SetData(const QVariantMap &map)
{beginResetModel();m_hor_hedlbls = map["headerlabel"].toStringList();m_table_map = map;m_vec_hedlbls = map.keys();endResetModel();
}void NARI_TableItemModel::setHignlightIndex(QVector<QPair<int, int> > vec_index)
{beginResetModel();m_highlight_indexs = vec_index;endResetModel();
}Qt::ItemFlags NARI_TableItemModel::flags(const QModelIndex &index) const
{Qt::ItemFlags flags = QAbstractItemModel::flags(index);flags |= Qt::ItemIsEditable;return flags;
}QVariant NARI_TableItemModel::data(const QModelIndex &_index, int role) const
{if(role == Qt::DisplayRole || role == Qt::EditRole){QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[_index.row()]].data());return (*_map)[m_hor_hedlbls[_index.column()]];}else if(role == Qt::TextAlignmentRole)  return Qt::AlignCenter; // 文字居中else if(role == Qt::BackgroundColorRole)                        // 设置背景色{if(m_highlight_indexs.contains(qMakePair<int, int>(_index.row(), _index.column())))return QColor(230, 247, 255);}
//    else if(role == Qt::DecorationRole)     // 为item添加图标
//    {
//        return QIcon(":/images/device.svg");
//    }return QVariant();
}QVariant NARI_TableItemModel::headerData(int section, Qt::Orientation orientation, int role) const
{if (orientation == Qt::Horizontal){if (role == Qt::DisplayRole)    return m_hor_hedlbls.at(section);else    return QVariant();}return QAbstractTableModel::headerData(section, orientation, role); // 垂直表头的序号
}bool NARI_TableItemModel::setData(const QModelIndex &_index, const QVariant &value, int role)
{if (_index.isValid() && role == Qt::EditRole){QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[_index.row()]].data());if((*_map)[m_hor_hedlbls[_index.column()]] != value){(*_map)[m_hor_hedlbls[_index.column()]] = value;emit dataChanged(_index, _index);emit itemChanged(_index, value);return true;}}return false;
}int NARI_TableItemModel::rowCount(const QModelIndex &parent) const
{if (parent.isValid())   return 0;else    return m_table_map.size() - 2;
}int NARI_TableItemModel::columnCount(const QModelIndex &parent) const
{if (parent.isValid())   return 0;else    return m_hor_hedlbls.size();
}QString NARI_TableItemModel::itemText(int row, int column) const
{QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[row]].data());return (*_map)[m_hor_hedlbls[column]].toString();
}QString NARI_TableItemModel::itemText(const QModelIndex &index) const
{QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[index.row()]].data());return (*_map)[m_hor_hedlbls[index.column()]].toString();
}void NARI_TableItemModel::setItemText(const QModelIndex &index, const QString &str)
{QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[index.row()]].data());(*_map)[m_hor_hedlbls[index.column()]] = str;
}void NARI_TableItemModel::setItemText(int row, int column, const QString &str)
{QVariantMap *_map = (QVariantMap*)(m_table_map[m_vec_hedlbls[row]].data());(*_map)[m_hor_hedlbls[column]] = str;
}QVariant NARI_TableItemModel::ItemData(const QModelIndex &index) const
{QVariantMap *_map = (QVariantMap*)(m_data_map[m_vec_hedlbls[index.row()]].data());return (*_map)[m_hor_hedlbls[index.column()]];
}QVariant NARI_TableItemModel::ItemData(int row, int column) const
{QVariantMap *_map = (QVariantMap*)(m_data_map[m_vec_hedlbls[row]].data());return (*_map)[m_hor_hedlbls[column]];
}void NARI_TableItemModel::SetItemData(const QModelIndex &index, const QVariant &data)
{QString vec_lbl = m_vec_hedlbls[index.row()];if(!m_data_map.contains(vec_lbl))   m_data_map[vec_lbl] = QVariantMap();QVariantMap *_map = (QVariantMap*)(m_data_map[vec_lbl].data());(*_map)[m_hor_hedlbls[index.column()]] = data;
}void NARI_TableItemModel::SetItemData(int row, int column, const QVariant &data)
{QString vec_lbl = m_vec_hedlbls[row];if(!m_data_map.contains(vec_lbl))   m_data_map[vec_lbl] = QVariantMap();QVariantMap *_map = (QVariantMap*)(m_data_map[vec_lbl].data());(*_map)[m_hor_hedlbls[column]] = data;
}void NARI_TableItemModel::clear()
{beginResetModel();m_table_map.clear();m_data_map.clear();m_hor_hedlbls.clear();m_vec_hedlbls.clear();m_highlight_indexs.clear();endResetModel();
}

mainwindow.cpp

// 填充数据
QVariantMap data_map;
data_map["headerlabel"] = QStringList() << "ID" << tr("jiange") << tr("device") << tr("device type") << tr("factory name") << tr("voltage type") << tr("wf identifier") << tr("wf tuichu");
data_map["headerenum"] = QVariantList() << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8;for(int i = 0; i < 100000; i++)
{
QVariantMap map_1;
map_1["ID"] = i + 1;
map_1["jiange"] = i + 2;
map_1["device"] = i + 3;
map_1["device type"] = i + 4;
map_1["factory name"] = i + 5;
map_1["voltage type"] = i + 6;
map_1["wf identifier"] = i + 7;
map_1["wf tuichu"] = i + 8;
data_map[QString::number(i) + "id"] = map_1;
}
table_model->SetData(data_map);    // 测试setHignlightIndex
void MainWindow::on_btn_hignlight_clicked()
{QVector< QPair<int, int> > indexs;for(int i = 0; i < 2000; i++){indexs.append(qMakePair<int ,int>(i, 2));}table_model->setHignlightIndex(indexs);
}// 测试setItemText,SetItemData()
void MainWindow::on_btn_setItemText_clicked()
{table_model->setItemText(1, 1, "test");table_model->SetItemData(1, 1, "aoligei");
}

效果演示如下:

到此为止基本的功能都有了,加载效率也很快,不过还有个问题,内存占用会非常大,一百万行数据甚至能占用1个多g的内存。这点可以通过QContiguousCache来优化,下一篇将会针对QContiguousCache进行内容的补充。

QTableView效率优化3 - 自定义Model的内容补充相关推荐

  1. 手机浏览器网址_「效率集」自定义网址导航高级功能介绍

    「效率集」是国内仅有的几家提供了个性自定义导航的网站,功能比hao123强,用户体验优于百度导航首页,且支持聚合搜索,方便用户从不同渠道(网页,微博,微信公众号,知乎,维基百科)获取信息:方便用户在网 ...

  2. 面向隐私计算的联邦学习激励机制与效率优化研究

    大致是了解了申请项目的全过程,写一份好的申请书,选择合适的课题真的十分重要 科研项目进展 希望能拿到国家级项目 – 好消息是拿国家级了--坏消息是EI即以上一篇论文+专利,未来有学弟看到这篇文章,申请 ...

  3. 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )

    文章目录 一.获取图像真实宽高 二.计算解码区域 三.设置解码参数 内存复用 像素格式 四.图像绘制 五.执行效果 六.源码及资源下载 官方文档 API : BitmapRegionDecoder 在 ...

  4. CSS 选择器优先级与效率优化

    CSS选择器优先级与效率优化 Date: 7th of Aug, 2015 Author: HaoyCn 本文收集网上各处关于CSS选择器的文章总结,并自己归纳一篇. 各类选择器的优先级 import ...

  5. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  6. 1. 代码效率优化方法论

    将"烂代码"优化为高效率代码的方法和路径 复杂度:衡量程序执行效率 场景:程序执行好几个小时.甚至好几天的情况,或者是执行过程中电脑几乎死机的情况 如果这个效率低下的系统是离线的, ...

  7. 跳点搜索算法 (JPS算法) 效率优化(摘录)

    摘自:腾讯游戏开发精粹(摘录一次加深记忆方便查找, 并未盈利,如有侵权 联系作者删除) 如感兴趣,请购买原书支持 谢谢配合 JPS主体思路: 表现上 JSP算法比A* 快很多, 实际上快到哪里了.我们 ...

  8. python提高效率(优化)的心得总结

    转载自:python提高效率(优化)的心得总结 作者:Capricorn.python 用python也有小两年了,不是开发,所以代码应该没那么精湛.但是经常会写测试脚本和小工具.在积累了大量的库以后 ...

  9. QT:在QTableView中使用各种自定义委托

    原文地址::https://blog.csdn.net/lhchen922/article/details/38367719 相关文章 1.QT:在QTableView中使用各种自定义委托----ht ...

  10. 什么是php model类,thinkphp的自定义model类有什么作用?

    请问,thinkphp的自定义model类有什么作用?如: <?php //自定义Modle类 namespace Home\Model; use Think\Model; class StuM ...

最新文章

  1. 关于Transformer,那些的你不知道的事
  2. 第十七课.Pytorch-geometric入门(二)
  3. SVM使用高斯核函数(RBF)时的超参数C和gamma如何选择
  4. 脚本安装Rocky版OpenStack 1控制节点+1计算节点环境部署
  5. java tcp ip原理_从0到1用java再造tcpip协议栈:ICMP协议的原理和实现
  6. 2016计算机应用论基础,2016-2017-2计算机应用基础理论复习题.docx
  7. wav音频文件转换为sbc音频文件
  8. 智能化汽车3D ToF摄像头
  9. C++修正儒略日转UTC时间
  10. 注册表中如何查找计算机名,怎么进行注册表搜索
  11. 中国大学慕课公开课-《视听语言》-学习笔记-2
  12. POJ_2228 Naptime ( 环状dp )
  13. 解决/var/lib/docker/overlay2占用很大、容器无法启动问题
  14. 控制台抓包和requests.post()发送请求
  15. OpenSSL国密爆出8.1分高危漏洞CVE-2021-3711
  16. 修复登录接口版最新知识付费小程序源码下载-独立后台版本
  17. 数学模型算法实现之Lingo求解五
  18. 湿气是怎么来的?身体湿气重什么症状
  19. JavaScript获取汉字拼音首字母(不支持多音字和火狐)
  20. 淘宝如何隐藏店铺首页宝贝让同行看不到商品链接,分享最新屏蔽淘宝天猫PC电脑端代码技术

热门文章

  1. 计算机图标在桌面右侧,怎样把桌面图标放到屏幕的右边??
  2. dell 笔记本禁用触摸板方法
  3. 站长必备-伪原创原创度检测软件v1.3 (支持百度/谷歌/360/搜狗/神马/微信)
  4. AB触摸屏2711P-T12W22A9P、2711P-T10C4A9,2711P-T10C22D8S-B、2711P-T10C22D9P-B、2711P-T12C10D2
  5. 图像相似度对比分析软件,图像相似度算法有哪些
  6. 最小生成树MST详解
  7. java调节音量_调节音量的流程
  8. 安卓 Handler 机制学习
  9. Appium 环境搭建
  10. 饥荒联机一直显示正在启动服务器,饥荒联机版一直正在启动服务器 | 手游网游页游攻略大全...