主要是幾個虛函數的實現,可查看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");
}
}
}
}