数据数据

要展示的数据如果是复杂点的,通过代码控制获取的,那肯定就不能是在qml中定义几串字符串那么简单了。

这时就可以编辑QAbstractListModel实现代码和qml中数据通信。

先想好数据类型,每个delegate需要一个图片地址,再加一个图片介绍吧。所以是一个链表,链表上的每个数据是两个字符串。

所以数据是这样:

typedef  struct dataMeta{QString url;QString info;
}m_data;typedef  QList<m_data> datalist;

然后整个类说白了就是服务于这条链表,在类里面定义的私有变量datalist dataList;

照着框架写

建立QAbstractListModel的子类,写好数据,当然数据还是挺简单的哈哈哈,但总有一天会有复杂的时候:

dataModel::dataModel(QObject *parent):QAbstractListModel(parent)
{QStringList infotemp;infotemp << "不知火曾经是离岛闻名天下的歌姬阿离,有着绝美的容颜。在一个即将失去生命的夜晚,她成为了大妖怪不知火。"<< "彼岸花是居住在冥界的妖怪,外表美艳动人,性格却难以捉摸。她常常出现在三途川边的彼岸花海中。虽然她曾经在人界生活过,但却很少提起自己的过去。"<< "曾经被称为“曜姬”的少女,如今却隐于夜幕之下。她昔日视为神明的女王,已失去了太阳的辉光。"<< "鬼切原是大江山之鬼,后被源赖光以自己的血为媒介封入守护刀,左眼被植入封闭记忆的契约。他在大江山、罗生门一战中记忆因妖气逐渐复苏,并开始向源赖光复仇。"<< "少羽大天狗为天狗一族,为身后孱弱的羽翼而感到自卑,渴望飞上群山之巅,内心却一直回响着消极的声音。终于在神秘的笛音中获得了内心坚定的力量,燃起内心的勇气,向崇天高云的风景发起了挑战,也回忆起自己的少年幼时。";for (int i = 0; i < 5; i++){m_data datatemp;datatemp.url = QString("qrc:/%1.jpg").arg(i+1);datatemp.info = infotemp.at(i);dataList << datatemp;}}

后面实现好框架定好的三个虚函数,就可以接入qml了。

QHash<int, QByteArray> roleNames() const

listmodel是类似键-键值的结构,这个函数需要写的就是键值名:

QHash<int, QByteArray> dataModel::roleNames() const {QHash<int, QByteArray> roleNames;roleNames[UrlRole] = QByteArrayLiteral("url");roleNames[InfoRole] = QByteArrayLiteral("info");return roleNames;
}

当然它用了hash数据结构,也不用自己操作什么,要做的就是定义好键名“url”和“info”。

而对应的第几个用一个枚举包含着,后续会用到:

enum dataRole {UrlRole = Qt::UserRole + 1,InfoRole
};

int rowCount(const QModelIndex &parent = QModelIndex()) const

这个函数是计算数据的数量,返回链表的长度即可。

int dataModel::rowCount(const QModelIndex &parent) const {return dataList.count();
}

要在pathview用到这个数据可以加一个Q_PROPERTY实现:

Q_PROPERTY(int count READ rowCount CONSTANT)

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const

这个虚函数就是返回键值的时候了,role定位刚刚定义的枚举,index是model数据链表的第几个,定义好数据返回即可,千篇一律:

QVariant dataModel::data(const QModelIndex &index, int role) const {if (index.row() < 0 || index.row() >= dataList.count())return QVariant();switch (role) {case UrlRole:return dataList.at(index.row()).url;case InfoRole:return dataList.at(index.row()).info;default:break;}return QVariant();
}

接入

在quickview构造之后立刻传入即可,构造写好的dataModel并按照指针传入,并定义好标识名datamodel,qml里就可以使用这个名字了:

view->rootContext()->setContextProperty(QStringLiteral("datamodel"), model);

qml里PathView的model可以选定为datamodel。

加一个Text段,用于显示图片介绍,首先先建立delegate的文本变量接住model的info变量:

property string infoText: info

后续编辑Text的时候可以pathView.currentItem定位到当前delegate,显示对应文本了。

弄好位置,发现文本不换行,网上查定义了wrapMode的很多种换行模式Qml中的Text控件,这里就随便选一种了。

Text
{anchors.left: pathView.leftanchors.leftMargin: root.width/5anchors.bottom: root.bottomanchors.bottomMargin: 120width: pathView.width*3/5height: 80opacity: 0.7text: pathView.currentItem.infoTextcolor: "white"font.pixelSize: 22wrapMode: Text.WrapAnywhere
}

恭喜!

数据是接入成功滴:

初识qml——PathView QQmlContext c++类与qml的数据交互相关推荐

  1. QT之在QML中使用C++类和对象的两种方式

    一 类的方式实现在QML中使用C++对象 二 对象的方式实现在QML中使用C++对象 QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Q ...

  2. Qml学习笔记:cpp与qml的交互调用方式

    Qml学习笔记:cpp与qml的交互调用方式 如何用在cpp中调用qml的方法 main.qml main.cpp 如何在qml中调用C++的方法函数 main.cpp main.qml 如何使用qm ...

  3. QML知识-与Qt数据交互

    使用Qml编程时,常常会与Qt之间进行数据访问或修改,本篇文章是介绍Qt与Qml的数据交互方法,一般有两种方法. TestModel头文件: #ifndef TESTMODEL_H #define T ...

  4. QML笔记-使用connect界面数据交互(qml中Designer使用)

    程序运行截图如下: 点击右边的sender 左边会接收到数据: 多次点击后: 这里关键是记录两点: 1. 是qml界面不同控件数据的传输 2. 使用设计器完成简单的qml控件设计 先来记录下qml中D ...

  5. QML笔记-4中方式运行qml文件

    目录 使用QQmlApplicationEngine运行qml 使用qml工具运行 使用qmlScene工具运行qml文件 使用QtQuick Prototype运行qml文件 使用QQmlAppli ...

  6. QML入门教程:一、QML和QtQuick简介以及QML实例

    从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代.而 Qt Qui ...

  7. QML进阶(十)动态加载QML元素

    通过搭配QML和JavaScript我们可以动态的对QML元素的生命周期进行管理.实现动态加载元素.动态实例化元素.动态销毁元素.同时我们还可以将动态创建的元素持久化到本地,并在需要的时候进行恢复使用 ...

  8. mysql类exadata功能_几类关系型数据库的数据解决方案

    今天聊下几类关系型数据库的数据解决方案,算是抛砖引玉,近期也要对技术方向上做一些扩展,也算是前期的小结吧. 1 3 Oracle 目前市面上的主流版本应该还是11gR2,记得很多年前有个网站做过一次调 ...

  9. java使用Socket类接收和发送数据

    java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接 ...

最新文章

  1. C# 系统应用之清除Cookies、IE临时文件、历史记录 转载
  2. python压测接口_python的一个接口压测脚本
  3. 【解决办法】Oracle登录报错ORA-28000: the account is locked
  4. 如何做好数字化体验管理,了解一下?
  5. MyBatis Generator Example.Criteria 查询条件复制
  6. SpringBoot+SpringCache+Redis补充
  7. Redis:12---有序集合对象
  8. 大电流dcdc降压芯片20a_5V转1.8V稳压芯片,3.7V转1.8V稳压芯片
  9. 翻译文章第六章4-7
  10. 深入了解VB中的变量和指针
  11. bzoj 3316: JC loves Mkk(二分+单调队列)
  12. python获取每月的最后一天_关于日期:使用Python获取本月的最后一天
  13. silverlight 地图轨迹回放
  14. 深入浅出vuejspdf下载_vue下载pdf
  15. 应聘的16个经典面试问题回答思路
  16. teradata中no more spool space
  17. 面向产品的新一代端到端唤醒框架 wekws 正式发布
  18. 蛋白质结构预测 AlphaFold2、ColabFold、Uni-Fold、ESMFold
  19. 1.4 NBU配置备份策略(Policy)
  20. 国外LEAD,联盟经理常见问答

热门文章

  1. 双十一值得入手的运动耳机推荐,2022年好用排行榜运动耳机推荐
  2. 资产变现,国资入场,中南建设的破局之路
  3. Android开源日志框架xlog
  4. android view 虚线分割线,RecyclerView设置分割线---DividerItemDecoration
  5. BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
  6. html迪士尼网页实现代码
  7. linux打包tar包命令,Linux之打包指令——tar
  8. java爬取百度贴吧所有用户头像
  9. 面试官一听就想发offer的自我介绍,到底是怎么做的?
  10. 文献翻译 载重汽车变速箱