QML----复制指定下标的ListModel数据

我现在有一个写好的listmodel,我需要从里边抽取35个数据作为展示

头文件

c++ 复制代码
#ifndef GETONEPAGESIZEMEMBERLISTMODEL_H
#define GETONEPAGESIZEMEMBERLISTMODEL_H

#include <QObject>
#include <QAbstractListModel>
#include <QDebug>
#include "mylistmodel.h" // 引入 需要复制的listmodel的头文件

// MYListModel 类用于从源模型中提取一页大小的数据
class GetOnePageSizeMemberListModel : public GroupMemberListModel {
    Q_OBJECT // 宏,允许使用 Qt 的信号和槽机制

public:
    // 构造函数,初始化源模型和分页信息
    explicit GetOnePageSizeMemberListModel(QAbstractListModel *sourceModel, int start, int end, QObject* parent = nullptr);

    // 返回行数,重写基类方法
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    // 返回特定索引处的数据,重写基类方法
    QVariant data(const QModelIndex& index, int role) const override;

    friend class CopyModelManager; // 声明 CopyModelManager 为友元类,允许其访问私有成员

private:
    QAbstractListModel *m_sourceModel; // 源模型的指针
    int m_start; // 起始索引
    int m_end;   // 结束索引
};

// CopyModelManager 类用于管理模型的复制操作
class CopyModelManager : public QObject {
    Q_OBJECT // 宏,允许使用 Qt 的信号和槽机制

public:
    // 构造函数
    explicit CopyModelManager(QObject* parent = nullptr);

    // 获取单例实例
    static CopyModelManager* getCopyModelHandle();

    // 创建并返回一个复制的模型
    Q_INVOKABLE MyListModel* createCopyModel(QAbstractListModel *sourceModel, int start, int end, QObject* parent = nullptr);

private:
    static CopyModelManager* m_pCopyModelHandle; // 单例模型的指针
};

#endif // GETONEPAGESIZEMEMBERLISTMODEL_H

cpp

c++ 复制代码
#include "getonepagesizememberlistmodel.h"

// GetOnePageSizeMemberListModel 的构造函数
GetOnePageSizeMemberListModel::GetOnePageSizeMemberListModel(QAbstractListModel *sourceModel, int start, int end, QObject *parent)
    : QAbstractListModel(parent), // 初始化基类
      m_sourceModel(sourceModel),  // 保存源模型指针
      m_start(start),              // 保存起始索引
      m_end(end)                  // 保存结束索引
{
}

// 重写 rowCount 方法,返回当前页的数据行数
int GetOnePageSizeMemberListModel::rowCount(const QModelIndex &parent) const
{
    // 计算并返回有效的行数
    return std::max(0, std::min(m_end, m_sourceModel->rowCount()) - m_start);
}

// 重写 data 方法,返回指定索引的数据
QVariant GetOnePageSizeMemberListModel::data(const QModelIndex &index, int role) const
{
    // 检查索引的有效性
    if (index.row() < 0 || index.row() >= rowCount()) {
        return QVariant(); // 返回无效 QVariant
    }
    // 从原始模型复制数据,返回指定角色的数据
    return m_sourceModel->data(m_sourceModel->index(index.row() + m_start, 0), role);
}

// CopyModelManager 的静态成员初始化
CopyModelManager* CopyModelManager::m_pCopyModelHandle = nullptr;

// CopyModelManager 的构造函数
CopyModelManager::CopyModelManager(QObject *parent) : QObject(parent) {
}

// 获取 CopyModelManager 的单例实例
CopyModelManager *CopyModelManager::getCopyModelHandle()
{
    if (nullptr == m_pCopyModelHandle) {
        m_pCopyModelHandle = new CopyModelManager(); // 创建单例
    }
    return m_pCopyModelHandle; // 返回单例指针
}

// 创建并返回一个复制的模型
MyListModel* CopyModelManager::createCopyModel(QAbstractListModel *sourceModel, int start, int end, QObject *parent)
{
    // 创建 GetOnePageSizeMemberListModel 的实例
    MyListModel *copyListModel = new GetOnePageSizeMemberListModel(sourceModel, start, end, parent);
    return copyListModel; // 返回复制模型
}

从原始模型复制数据,rowcount返回的是获取数据的行数,data返回获取的第一个数据的下标.

随后在qml中注册类,调用createCopyModel(originListModel,0,35),就能得到原始model的前35个数据

相关推荐
小灰灰搞电子4 小时前
Rust+Slint 实现动态轮播图源码分享,支持动态删除、添加
开发语言·rust·slint·动态轮播图
其实防守也摸鱼4 小时前
免杀与持久化入门:从载荷免杀到隐蔽通道的完整指南
运维·服务器·数据库·安全·github·copilot·渗透
SelectDB4 小时前
统一全文检索与 SQL 分析:Apache Doris 日志分析实践
运维·数据库·掘金技术征文
前端 贾公子4 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
麻瓜code5 小时前
【MySQL】SQL优化实战:从慢查询定位到查询改写
数据库·sql·mysql
sunburn-5 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
jayson.h5 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python
蓝鸟19745 小时前
Oracle HIS业务视图优化实战|VI_BQ_YWTX11从高耗费到秒级响应
数据库·oracle·his数据库调优·复合索引踩坑·is null索引问题·ql视图优化
qq_322762755 小时前
一个接口从能用到稳定,中间差的到底是什么
服务器·开发语言·lua·接口·fastapi·请求
Data_Journal5 小时前
Scrapyd:分步教程
开发语言·python·microsoft·golang·编辑器·html·iphone