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的灯效亮度
}