QAbstractListModel:Qml 使用C++model

主要是几个虚函数的实现,可查看QAbstractListModel的父类
主要是对内部维护的动态数组进行操作
具体实现:

#ifndef MYMODEL_H
#define MYMODEL_H

#include <QAbstractListModel>
#include <QHash>
#include <QList>
#include <QByteArray>
#include <QDebug>
#include <vector>
class mydata
{
public:
    mydata(const QString& data1, const QString& data2):mdata1(data1),mdata2(data2)
    {

    }
    QString  data1() const { return this->mdata1; }
    QString  data2() const { return this->mdata2; }
    QVariant  obj;//当前model的组件对象
private:
    QString  mdata1;
    QString mdata2;
};


class MyModel  :public QAbstractListModel
{
    Q_OBJECT
public:
    enum datatype{
        type1=1,
        type2,
        type3
    };
    MyModel(QObject*  parent=NULL);

    //外部接口 QML调用 添加数据 
    Q_INVOKABLE void pushdata(const QString& data1, const QString& data2);
    //外部接口 QML调用 添加数据在指定行
    Q_INVOKABLE void  minsert(int index, const QString& data1, const QString& data2);
    //外部接口 删除指定行
    Q_INVOKABLE void  mremove(int index);

    //外部接口 C++调用 添加数据
    void  Add(mydata&  md);
    //外部接口 清除model
    Q_INVOKABLE void clear();



    //虚函数  qml内部调用  获取第index行的内容  role 内容索引
    QVariant data(const QModelIndex &index, int role =Qt::DisplayRole) const;
    //虚函数     获取model行数
    int rowCount(const QModelIndex &parent  = QModelIndex() ) const;
    // 虚函数 内容的别名  qml 内部调用
      QHash<int, QByteArray> roleNames()  const;

      //自定义  设置当前model第index行的当前组件指针
    Q_INVOKABLE void setcuritem(int index , QVariant  j)
    {
        //qDebug()<<j;
        m_datas[index].obj = j;
    }

    ~MyModel() {}




private:
      //model数据集合 
    std::vector<mydata>  m_datas;
};



#endif

#include "mymodel.h"

MyModel::MyModel(QObject* parent) :QAbstractListModel(parent)
{

}
void MyModel::Add(mydata& md)
{
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    m_datas.push_back(md);
    endInsertRows();
}
void MyModel::clear()
{
    //清除rows 界面将不显示
    beginRemoveRows(QModelIndex(), 0, m_datas.size());
    //清空动态数组
    m_datas.clear();
    endRemoveRows();
    //end

}
//外部接口 QML调用 添加数据在指定行
void  MyModel::minsert(int index, const QString& data1, const QString& data2)
{
    mydata  d(data1, data2);
    beginInsertRows(QModelIndex(), index, index);
    m_datas.insert(m_datas.begin()+index, d);
    endInsertRows();
}
void  MyModel::mremove(int index)
{
    beginRemoveRows(QModelIndex(), index, index);
    m_datas.erase(m_datas.begin() + index);
    endRemoveRows();
}
void MyModel::pushdata(const QString& data1, const QString& data2)
{
    mydata  d(data1, data2);
    Add(d);
}
int MyModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_datas.size();
}
QVariant MyModel::data(const QModelIndex &index, int role)  const
{
    if (index.row() < 0 || index.row() >= m_datas.size())
    {
        return QVariant();
    }
    const mydata& d = m_datas[index.row()];
    if (role == datatype::type1)
    {
        return d.data1();

    }
    else if (role == datatype::type2)
    {
        return d.data2();
    }
    else if (role == datatype::type3)
    {
        return d.obj;
    }
    return QVariant();


}

//定义数据别名  QHash<int, QByteArray> 父类规定的
QHash<int, QByteArray> MyModel::roleNames() const
{
    QHash<int, QByteArray>  d;
    d[datatype::type1] = "data1";
    d[datatype::type2] = "data2";
    d[datatype::type3] = "curitem";
    return  d;
}
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include<qmlglobaldata.h>
#include<QQmlContext>
#include "mymodel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);



    MyModel * m = new MyModel();
    mydata  xx("aaa,", "aaa2");
    m->Add(xx);

    mydata  xx2("bbb,", "bbb2");
    m->Add(xx2);
    QQmlApplicationEngine engine; 
    engine.rootContext()->setContextProperty("mymodel", m);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView{
        anchors.fill: parent
        model:mymodel
        delegate: Text {
            id: name
            text: model.data1 +model.data2
            Component.onCompleted: {
               mymodel.setcuritem(index,this)
                console.log(curitem)
            }
        }
        Component.onCompleted: {

            for(var x =0;x<100;x++)
            {
                      mymodel.pushdata(x+"a,",x+"b");
            }


        }
    }
}
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值