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"); } } } }
相关文章推荐
- Leetcode 67. Add Binary (Easy) (cpp)
- C/C++ sort函数的用法
- 【7.13第三题】穿越栅栏【USACO2.4.2简单版本】
- C语言 程序 字符串转换成整型,整型转换成字符串
- 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记
- C语言文件操作之----文件的读写
- C++将使用类型转换
- 《C++ Primer Plus》15.5 类型转换运算符 学习笔记
- <C++略识>之内联函数
- <C++略识>之函数重载
- Strlen在实际使用中的一点体会
- C++语言语法你应该知道的(基础篇)
- C++ pair(对组)用法
- 精通C++资源管理-以对象管理资源
- <C++略识>之内存分配
- USACO2.4.2 穿越栅栏(简单版本) (重庆一中高2018级信息学竞赛测验2) 解题报告
- 有序数组长度为N 元素出现的长度为 大于等于 N 除 4 的最小的数
- 劣质的草(USACO 美国信息学月赛)【7.13考试第一题】
- Leetcode 258. Add Digits (Easy) (cpp)
- 操作系统第四版习题答案大全