qt5的mvc模型视图代理实现,其中model有9列数据,最多20行数据,根据数据内容QVector<YX_INFO*>类的总数来分页。 列数据依次为:点号,信息描述,遥信位,动作时间,复归时间,验收时间,确认状态,确认/取消,通道类型, 其中1,2,3,8,9列数据初始化有数据,其他列数据为空。第8列数据是ico图标。 初始化的时候只加载一页数据。 当有新的数据来的时候,清除当前页的数据和内存,比较该数据属于哪一页加载改页,并选中数据行,颜色置高亮,更新选中行的其他数据,其中第8列数据更改图标,请思考一下,给出代码c++用例

时间: 2024-03-21 07:42:51 浏览: 25
下面给出一个简单的Qt5的MVC模型视图代理实现示例,其中model有9列数据,最多20行数据,根据数据内容QVector<YX_INFO*>类的总数来分页。 ```cpp // 自定义代理类 class MyDelegate : public QStyledItemDelegate { public: explicit MyDelegate(QObject *parent = nullptr); // 重写paint方法,绘制第8列的ico图标 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; MyDelegate::MyDelegate(QObject *parent) : QStyledItemDelegate(parent) {} void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 7) { // 获取第8列的数据 int confirmStatus = index.data(Qt::DisplayRole).toInt(); // 根据数据绘制不同的ico图标 QIcon icon; if (confirmStatus == 0) { icon = QIcon(":/images/confirm.png"); } else { icon = QIcon(":/images/cancel.png"); } QRect rect = option.rect; QSize iconSize = icon.actualSize(rect.size() * 0.8); QPoint center = rect.center(); QRect iconRect(center.x() - iconSize.width() / 2, center.y() - iconSize.height() / 2, iconSize.width(), iconSize.height()); icon.paint(painter, iconRect); } else { QStyledItemDelegate::paint(painter, option, index); } } // 自定义模型类 class MyModel : public QAbstractTableModel { public: explicit MyModel(QObject *parent = nullptr); // 重写基类方法,返回模型的行数、列数、数据、标头等 int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; // 加载数据的方法,根据QVector<YX_INFO*>类的总数分页加载 void loadData(const QVector<YX_INFO*> &data); // 选中数据行的方法,更新第8列数据并发送信号 void selectRow(int row); signals: void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()); private: QVector<QVector<QVariant>> m_data; // 存放所有数据的二维数组 QList<QVector<QVariant>> m_currentPageData; // 存放当前页数据的列表 int m_currentPageNum; // 当前页码 int m_pageSize; // 每页数据量 }; MyModel::MyModel(QObject *parent) : QAbstractTableModel(parent), m_currentPageNum(0), m_pageSize(20) {} int MyModel::rowCount(const QModelIndex &parent) const { return m_currentPageData.count(); } int MyModel::columnCount(const QModelIndex &parent) const { return 9; } QVariant MyModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) { return m_currentPageData.at(index.row()).at(index.column()); } else if (role == Qt::BackgroundRole) { // 如果是选中行,则设置背景色为高亮 if (index.row() == m_selectedRow) { return QColor(Qt::yellow); } } return QVariant(); } QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { QStringList headers; headers << tr("点号") << tr("信息描述") << tr("遥信位") << tr("动作时间") << tr("复归时间") << tr("验收时间") << tr("确认状态") << tr("确认/取消") << tr("通道类型"); return headers.at(section); } return QVariant(); } void MyModel::loadData(const QVector<YX_INFO*> &data) { // 清除当前页数据和内存 m_data.clear(); m_currentPageData.clear(); // 初始化数据 for (int i = 0; i < data.size(); i++) { QVector<QVariant> row; row << data.at(i)->pointNo << data.at(i)->desc << data.at(i)->yxBit << data.at(i)->actionTime << data.at(i)->resetTime << data.at(i)->checkTime << data.at(i)->confirmStatus << "" << data.at(i)->channelType; m_data.append(row); } // 根据数据总数计算总页数 int totalPageNum = (data.size() - 1) / m_pageSize + 1; // 加载第一页数据 m_currentPageNum = 1; int startIndex = (m_currentPageNum - 1) * m_pageSize; int endIndex = qMin(startIndex + m_pageSize, data.size()); for (int i = startIndex; i < endIndex; i++) { m_currentPageData.append(m_data.at(i)); } // 发送数据改变信号 QModelIndex startIndexModel = index(0, 0); QModelIndex endIndexModel = index(m_currentPageData.size() - 1, 8); QVector<int> roles; roles << Qt::DisplayRole; emit dataChanged(startIndexModel, endIndexModel, roles); } void MyModel::selectRow(int row) { if (row < 0 || row >= m_currentPageData.size()) { return; } // 更新第8列数据 int confirmStatus = m_currentPageData.at(row).at(6).toInt(); if (confirmStatus == 0) { m_currentPageData[row][7] = "已确认"; m_currentPageData[row][6] = 1; } else { m_currentPageData[row][7] = "已取消"; m_currentPageData[row][6] = 0; } // 发送数据改变信号 QModelIndex topLeft = index(row, 6); QModelIndex bottomRight = index(row, 7); QVector<int> roles; roles << Qt::DisplayRole; emit dataChanged(topLeft, bottomRight, roles); // 更新选中行 m_selectedRow = row; emit dataChanged(index(row, 0), index(row, 8), QVector<int>() << Qt::BackgroundRole); } ``` 使用示例: ```cpp // 创建模型和代理 MyModel *model = new MyModel(this); MyDelegate *delegate = new MyDelegate(this); ui->tableView->setModel(model); ui->tableView->setItemDelegate(delegate); // 加载数据 QVector<YX_INFO*> data; // 假设已经准备好了数据 model->loadData(data); // 选中某行数据 model->selectRow(0); ```

相关推荐

最新推荐

recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB图像处理算法宝典:从理论到实战

![MATLAB图像处理算法宝典:从理论到实战](https://img-blog.csdnimg.cn/20200717112736401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1emhhbzk5MDE=,size_16,color_FFFFFF,t_70) # 1. MATLAB图像处理基础理论 MATLAB图像处理是一种利用MATLAB编程语言进行图像处理的强大工具。它提供了丰富的函数和工具箱,用于图像获取、增强、分
recommend-type

matlab中1/x的非线性规划

在MATLAB中,可以使用非线性规划函数(`fmincon`)来优化一个包含1/x的非线性目标函数。下面是一个简单的例子: ```matlab % 定义目标函数 fun = @(x) 1/x; % 定义约束函数(这里没有约束) nonlcon = []; % 定义初始点 x0 = 1; % 定义优化选项 options = optimoptions('fmincon', 'Display', 'iter'); % 进行非线性规划 [x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, options); ``` 在
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB数据可视化黑科技:洞悉数据背后的秘密

![MATLAB数据可视化黑科技:洞悉数据背后的秘密](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB数据可视化的基本原理 MATLAB数据可视化是一种将数据转化为图形表示形式的技术,以帮助人们理解和分析数据。其基本原理包括: - **数据表示:**将原始数据转换为图形元素,如点、线和条形。 - **图形布局:**确定图形元素在绘图区域中的位置和大小。 - **图形美化:**添加标题、标签、颜色和纹理等元素,以增强图形的可读性和美观性。 - **交互性:**允
recommend-type

优化算法计算单位面积年平均输出热功率的代码

计算单位面积年平均输出热功率的代码具体情况取决于你所要解决的问题和需要的数据。然而,我可以给你一个通用的优化算法的框架,你可以根据具体情况进行调整。 首先,你需要明确计算单位面积年平均输出热功率的数学公式或算法。假设你已经有了计算热功率的函数 `calculate_power`,它接受一些输入参数,并返回热功率值。 下面是一个示例的优化算法框架,以最大化单位面积年平均输出热功率为目标: ```python import random def objective_function(params): # 这个函数用于计算目标函数的值 # 根据具体情况,你需要将 params
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

关系数据表示学习

关系数据卢多维奇·多斯桑托斯引用此版本:卢多维奇·多斯桑托斯。关系数据的表示学习机器学习[cs.LG]。皮埃尔和玛丽·居里大学-巴黎第六大学,2017年。英语。NNT:2017PA066480。电话:01803188HAL ID:电话:01803188https://theses.hal.science/tel-01803188提交日期:2018年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaireUNIVERSITY PIERRE和 MARIE CURIE计算机科学、电信和电子学博士学院(巴黎)巴黎6号计算机科学实验室D八角形T HESIS关系数据表示学习作者:Ludovic DOS SAntos主管:Patrick GALLINARI联合主管:本杰明·P·伊沃瓦斯基为满足计算机科学博士学位的要求而提交的论文评审团成员:先生蒂埃里·A·退休记者先生尤尼斯·B·恩