QML----复制指定下标的ListModel数据
我现在有一个写好的listmodel,我需要从里边抽取35个数据作为展示
头文件
#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
#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个数据