三、AbstractListModel

cpp端会需要提供几个表给qml来显示,所以先设计AbstractListModel

1、.h文件

#ifndef ABSTRACTLISTMODELBASE_H
#define ABSTRACTLISTMODELBASE_H

#include <QObject>
#include <QAbstractListModel>
#include <QMetaEnum>

class AbstractListModelBase : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
public:
    explicit AbstractListModelBase(QObject *parent = nullptr);
    virtual ~AbstractListModelBase();

    QVariant data(const QModelIndex &index, int role) const override;
    QVariantMap data(int row) const;
    QVariant data(int row,int role) const;
    Q_INVOKABLE QVariantMap get(int index) const;
    Q_INVOKABLE QVariant get(int index,int role) const;

    QHash<int, QByteArray> roleNames() const override;
    Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    Q_INVOKABLE virtual bool setData(int row, const QVariant &value,int role);
    bool setData(int row, const QVariantMap &value);
    Q_INVOKABLE bool set(int index,const QVariantMap &value);
    Q_INVOKABLE bool set(int index,const QVariant &value, int role = Qt::EditRole);

    Q_INVOKABLE virtual void append(const QVariantMap &data);
    Q_INVOKABLE void append();
    Q_INVOKABLE virtual void insert(int row, const QVariantMap &data);
    Q_INVOKABLE virtual void remove(int row);
    Q_INVOKABLE virtual void clear();


protected:
    void generateRoleNames(const QMetaEnum &metaEnum);
    QList<QVariantMap> dataList;

private:
    QHash<int, QByteArray> m_roleNames;
signals:
    void dataInserted(int row);
    void dataRemoved(int row);
    void itemChanged(int row,int role);
    void countChanged();

    void variantMapChanged(int index);
    void variantChanged(int index,int role);
};

#endif // ABSTRACTLISTMODELBASE_H

继承QAbstractListModel,然后重写以及新建了些方法。

2、cpp文件

#include "abstractlistmodelbase.h"

AbstractListModelBase::AbstractListModelBase(QObject *parent)
    : QAbstractListModel{parent}
{

}

AbstractListModelBase::~AbstractListModelBase()
{
    dataList.clear();
    m_roleNames.clear();
}

/**
 * @brief AbstractListModelBase::generateRoleNames 创建角色名
 * @param metaEnum
 */
void AbstractListModelBase::generateRoleNames(const QMetaEnum &metaEnum)
{
    for (int i = 0; i < metaEnum.keyCount(); ++i)
    {
        m_roleNames[metaEnum.value(i)] = QByteArray(metaEnum.key(i));
    }
}

/**
 * @brief AbstractListModelBase::roleNames 角色名
 * @return
 */
QHash<int, QByteArray> AbstractListModelBase::roleNames() const
{
    return m_roleNames;
}

/**
 * @brief AbstractListModelBase::rowCount 行数
 * @param parent
 * @return
 */
int AbstractListModelBase::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return dataList.size();
}

/**
 * @brief AbstractListModelBase::data 数据
 * @param index 索引
 * @param role  角色
 * @return
 */
QVariant AbstractListModelBase::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() >= dataList.count())
        return QVariant();

    const QVariantMap &rowMap = dataList.at(index.row());
    return rowMap.value(m_roleNames.value(role));
}

/**
 * @brief AbstractListModelBase::setData 设置数据
 * @param index 索引
 * @param value 值
 * @param role 角色
 * @return
 */
bool AbstractListModelBase::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role >= Qt::UserRole)
    {
        QVariantMap &rowMap = dataList[index.row()];
        rowMap[m_roleNames.value(role)] = value;
        emit dataChanged(index, index, {role});
        return true;
    }
    return false;
}

/**
 * @brief AbstractListModelBase::setData 设置数据
 * @param row 行
 * @param value 值
 * @param role 角色
 * @return
 */
bool AbstractListModelBase::setData(int row, const QVariant &value,int role)
{
    if (row >= 0 && row < dataList.size() && m_roleNames.contains(role))
    {
        QVariantMap &rowMap = dataList[row];
        rowMap[m_roleNames.value(role)] = value;
        QModelIndex index = createIndex(row, 0);
        emit dataChanged(index, index, {role});
        emit itemChanged(row,role);
        return true;
    }
    return false;
}

/**
 * @brief AbstractListModelBase::setData 设置数据
 * @param row 行
 * @param value 值
 * @return
 */
bool AbstractListModelBase::setData(int row, const QVariantMap &value)
{
    if (row < 0 || row >= dataList.size()) {
        return false; // Row is out of range
    }

    dataList[row] = value;
    QModelIndex index = createIndex(row, 0);
    emit dataChanged(index, index);
    return true;
}

/**
 * @brief AbstractListModelBase::set 设置数据,这一个专门用于qml使用
 * @param index
 * @param value
 * @return
 */
bool AbstractListModelBase::set(int index,const QVariantMap &value)
{
    bool result = setData(index,value);
    if(result)
        emit variantMapChanged(index);
    return result;
}
bool AbstractListModelBase::set(int index,const QVariant &value, int role)
{
    bool result = setData(index,value,role);
    if(result)
        emit variantChanged(index,role);
    return result;
}

QVariantMap AbstractListModelBase::data(int row) const
{
    if(row >= 0 && row < dataList.size())
    {
        return dataList.at(row);
    }
    else
    {
        return QVariantMap(); // 返回一个空的 QVariantMap 如果索引无效
    }
}

QVariantMap AbstractListModelBase::get(int index) const
{
    return data(index);
}

QVariant AbstractListModelBase::get(int index,int role) const
{
    return data(index,role);
}

QVariant AbstractListModelBase::data(int row,int role) const
{
    if(row >= 0 && row < dataList.size())
    {
        const QVariantMap &rowMap = dataList.at(row);
        return rowMap.value(m_roleNames.value(role));
    }
    else
    {
        return QVariant(); // 返回一个空的 QVariantMap 如果索引无效
    }
}

/**
 * @brief AbstractListModelBase::append 添加空白行
 */
void AbstractListModelBase::append()
{
    int newRow = dataList.size();
    QVariantMap data;
    beginInsertRows(QModelIndex(), newRow, newRow);
    dataList.append(data);
    endInsertRows();
    emit countChanged();
}

/**
 * @brief AbstractListModelBase::append 添加数据
 * @param data
 */
void AbstractListModelBase::append(const QVariantMap &data)
{
    int newRow = dataList.size();

    beginInsertRows(QModelIndex(), newRow, newRow);
    dataList.append(data);
    endInsertRows();

    emit countChanged();
}

/**
 * @brief AbstractListModelBase::insert 插入数据
 * @param row 行
 * @param data  数据
 */
void AbstractListModelBase::insert(int row, const QVariantMap &data)
{
    if (row < 0 || row > dataList.size())
        return;

    beginInsertRows(QModelIndex(), row, row);
    dataList.insert(row, data);
    endInsertRows();
    emit countChanged();
}

/**
 * @brief AbstractListModelBase::remove 移除数据
 * @param row 行
 */
void AbstractListModelBase::remove(int row)
{
    if (row < 0 || row >= dataList.size())
        return;

    beginRemoveRows(QModelIndex(), row, row);
    dataList.removeAt(row);
    endRemoveRows();
    emit countChanged();
}

/**
 * @brief AbstractListModelBase::clear 清空数据
 */
void AbstractListModelBase::clear()
{
    beginResetModel();
    dataList.clear();
    endResetModel();
    emit countChanged();
}

然后后面所有的model写法如下:

1、.h

#ifndef LEDMODEL_H
#define LEDMODEL_H

#include<QObject>
#include"abstractlistmodelbase.h"

class LedModel : public AbstractListModelBase
{
    Q_OBJECT
public:
    enum DataRoles{
        lumin = Qt::UserRole + 1, //int
        speed,//int
        direction,//int
        multiColor,//bool
        userColor,//bool
        colorParam0,//int
        colorParam1,//int
        colorParam2,//int
    };

    Q_ENUM(DataRoles)

public:
    explicit LedModel(QObject *parent = nullptr);

signals:

};

#endif // LEDMODEL_H

2、cpp

#include "ledmodel.h"


LedModel::LedModel(QObject *parent)
    : AbstractListModelBase{parent}
{
    generateRoleNames(QMetaEnum::fromType<DataRoles>());
}

3、qml访问

ListView {
    id: led
    model: ledModel
}

funtion xx() {
    console.log(led.model.get(0).lumin); //打印索引为0的灯效亮度
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值