QAbstractListModel:Qml 使用C++model

来源:互联网 发布:mysql 有符号整型 编辑:程序博客网 时间:2024/06/06 03:51

主要是几个虚函数的实现,可查看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_OBJECTpublic:    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.7import QtQuick.Controls 2.0import QtQuick.Layouts 1.0ApplicationWindow {    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");            }        }    }}
0 0