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");
            }


        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章