qml demo分析(objectlistmodel-自定义qml数据)
一、效果展示
如图1所示,是一个ListView窗口,自定义了文本内容和项背景色。

图1 ListView
二、源码分析
代码比较简单,主要使用了QQmlContext类的setContextProperty方法,在当前context上下文中新增名字为name的属性,并为其赋值,该属性可以在qml系统中使用,注册代码如下,也是该示例的main函数
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv); QList<QObject*> dataList;
dataList.append(new DataObject("Item 1", "red"));
dataList.append(new DataObject("Item 2", "green"));
dataList.append(new DataObject("Item 3", "blue"));
dataList.append(new DataObject("Item 4", "yellow")); QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
QQmlContext *ctxt = view.rootContext();
ctxt->setContextProperty("myModel1", QVariant::fromValue(dataList));//将数据设置到myModel属性中
//![0] view.setSource(QUrl("qrc:view.qml"));
view.show(); return app.exec();
}
DataObject为自定义对象,继承自QObject类,如果自定义的C++类需要注册到qml系统则必须继承自QObject,并且需要声明Q_OBJECT宏。DataObject头文件声明如下,主要作用是自定义了name和color两个属性,并为其添加了set和get接口,并使用Q_PROPERTY宏将其注册到qml系统中。
class DataObject : public QObject
{
Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)//注册属性到qml系统
Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
//![0] public:
DataObject(QObject *parent=);
DataObject(const QString &name, const QString &color, QObject *parent=); //属性get和set方法
QString name() const;
void setName(const QString &name); //属性get和set方法
QString color() const;
void setColor(const QString &color); signals:
void nameChanged();
void colorChanged(); private:
QString m_name;
QString m_color;
//![1]
};
使用setContextProperty接口注册后属性可以直接被qml系统使用,具体代码如下
ListView {
width: ; height:
model: myModel1
delegate: Rectangle {
height:
width: parent.width
color: model.modelData.color//或者modelData.color 不能像name一样直接使用属性名称 因为color值和color属性重名
Text { text: name }//自定义DataObject结构中 使用Q_PROPERTY属性注册的属性名
}
}
在ListView控件中,我们指定了model的数据源为我们注册的属性,在ListView的绘制代理中我们可以直接访问我们注册的自定义类DataObject,访问方式是直接访问属性名称,就想上述代码第9行那样,第8行代码之所以加上作用于限定是因为属性名color重复了,当直接访问属性名称时,其实就等同于访问属性的get方法,设置属性时就等同于访问属性的set方法。
这篇示例代码在Qt5.7.0_vs2013\Examples\Qt-5.7\quick\models\objectlistmodel目录下。我使用的qt5.6.1-1版本,该版本为自行编译版本,编译参考:msvc2013编译qt5.6源码
qml demo分析(objectlistmodel-自定义qml数据)的更多相关文章
- qml demo分析(threadedanimation-线程动画)
一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...
- qml demo分析(maskedmousearea-异形窗口)
一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...
- qml demo分析(maroon-小游戏)
1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1 游戏开始 图2 游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...
- qml demo分析(abstractitemmodel-数据分离)
一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...
- qml demo分析(threading-线程任务)
一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...
- qml demo分析(customgeometry-贝塞尔曲线)
一.效果展示 本篇文章还是带来一个简单的qt示例分析,且看图1效果. 图1 贝塞尔曲线 二.源码分析 该示例代码所在目录quick\scenegraph\customgeometry,感兴趣的同学可以 ...
- qml demo分析(externaldraganddrop-拖拽)
一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...
- qml demo分析(samegame-拼图游戏)
一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...
- qml demo分析(text-字体展示)
上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单 ...
随机推荐
- 嘿嘿嘿,开始自学mysql
开始学习mysql了,作为非计算机专业学生,必须需要一个地方来给自己的知识进行一些记录和总结. 一SQL语句 数据库是不认识java语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言S ...
- Android圆形头像,拍照后“无法加载此图片”的问题解决(适配Android7.0)
Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像. Problem: 拍好照片,点击裁剪,弹Toast"无法加载此图片". Solution: 在裁剪 ...
- Centos6.4 + mysql-5.6.38-linux-glibc2.12-x86_64.tar 实现mysql主从复制
mysql安装方法:http://www.cnblogs.com/lin3615/p/4376224.html 用到的是两台服务器 主:192.168.1.106 从:192.168.1.69 1.在 ...
- PHP全栈学习笔记12
php简介,php历史,php后端工程师职业前景,php技术方向,php后端工程师职业体系介绍. php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言 ...
- Java中堆(heap)和栈(stack)的区别
简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...
- Spring Cloud Alibaba基础教程:Nacos的集群部署
继续说说生产环境的Nacos搭建,通过上一篇<Spring Cloud Alibaba基础教程:Nacos的数据持久化>的介绍,我们已经知道Nacos对配置信息的存储原理,在集群搭建的时候 ...
- [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
1.项目运行过程中遇到个问题,保存临时文件时,一直返回false 2.根据经验这个是在/tmp目录下建立临时文件,所以检查了一遍权限问题,发现权限没有问题 3.查出sys_get_temp_dir() ...
- Vue.js 学习笔记 第1章 初识Vue.js
本篇目录: 1.1 Vue.js 是什么 1.2 如何使用Vue.js 本章主要介绍与Vue.js有关的一些概念与技术,并帮助你了解它们背后相关的工作原理. 通过对本章的学习,即使从未接触过Vue.j ...
- 用CSS画一个带阴影的三角形的示例代码
1. 思路 怎么用CSS3画一个带阴影的三角形呢 ? 有童鞋说, 这还不简单吗 网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题 假设我们做一个向下的三角形箭头 常见的方法大致有两种 ...
- U盘制作微pe工具箱(实战)
分享人:广州华软 浩言 前言 相信大家平时生活中还是工作上使用电脑的时间还是比较多的,有时候电脑出现故障,比如系统文件损坏,没办法正常开机,或者是开机密码忘了,想要重装系统等,下面我推荐一个U盘启动项 ...