您的位置:首页 > 编程语言 > C语言/C++

QAbstractListModel:Qml 使用C++model

2016-07-14 17:32 537 查看
主要是几个虚函数的实现,可查看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");
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: