qml demo分析(abstractitemmodel-数据分离)
一、概述
qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析。这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面,而数据存储、数据加工都交由qt来做(也可以认为是C++来实现复杂的逻辑),这样的话qml和qt关系就像是html和js的关系,以后使用qt我们也可以高效的开发出绚丽的桌面程序。
二、效果展示
如图1所示,数据展示使用了qml中的ListView控件,而数据存储使用的是QAbstractListModel。

图1 qml动态数据展示图
三、源码分析
1、main.cpp文件,添加定时器是为了动态添加数据,具体效果请看图1
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv); AnimalModel model;
model.addAnimal(Animal("Wolf", "Medium"));
model.addAnimal(Animal("Polar bear", "Large"));
model.addAnimal(Animal("Quoll", "Small")); QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
QQmlContext *ctxt = view.rootContext();
ctxt->setContextProperty("myModel", &model);
//![0] view.setSource(QUrl("qrc:view.qml"));
view.show(); QTimer time;
QObject::connect(&time, &QTimer::timeout, ctxt, [&model]{
model.addAnimal(Animal("Quoll", "Small")); });
time.start(); //qml嵌入QWidget方式
//QWidget * widget = QWidget::createWindowContainer(&view);
//widget->show(); return app.exec();
}
2、头文件
//自定义动物结构体,包含类型和大小两个字段
class Animal
{
public:
Animal(const QString &type, const QString &size); QString type1() const;//返回动物类型
QString size2() const;//返回动物大小 private:
QString m_type;
QString m_size;
};
//自定义model,用于存储List数据
class AnimalModel : public QAbstractListModel
{
Q_OBJECT
public:
enum AnimalRoles {
TypeRole = Qt::UserRole + ,
SizeRole
}; AnimalModel(QObject *parent = ); void addAnimal(const Animal &animal);//新增一个动物 int rowCount(const QModelIndex & parent = QModelIndex()) const;//返回指定索引包含的行数 QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;//返回索引的指定数据类型 protected:
QHash<int, QByteArray> roleNames() const;//各字段名称
private:
QList<Animal> m_animals;//动物列表
};
3、实现文件
Animal::Animal(const QString &type, const QString &size)
: m_type(type), m_size(size)
{
} QString Animal::type1() const
{
return m_type;
} QString Animal::size2() const
{
return m_size;
} AnimalModel::AnimalModel(QObject *parent)
: QAbstractListModel(parent)
{
} void AnimalModel::addAnimal(const Animal &animal)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());//model底层插入数据时必须调用该接口 第二个和第三个参数标示插入的开始和结束行
m_animals << animal;
endInsertRows();//标示插入结束
} int AnimalModel::rowCount(const QModelIndex & parent) const {
Q_UNUSED(parent);
return m_animals.count();
} QVariant AnimalModel::data(const QModelIndex & index, int role) const {
if (index.row() < || index.row() >= m_animals.count())
return QVariant(); const Animal &animal = m_animals[index.row()];
if (role == TypeRole)
return animal.type1();
else if (role == SizeRole)
return animal.size2();
return QVariant();
} QHash<int, QByteArray> AnimalModel::roleNames() const {
QHash<int, QByteArray> roles;//返回列名称
roles[TypeRole] = "type2";
roles[SizeRole] = "size";
return roles;
}
四、源码
源码路径:Examples\Qt-5.7\quick\models\abstractitemmodel
qml demo分析(abstractitemmodel-数据分离)的更多相关文章
- qml demo分析(threadedanimation-线程动画)
一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...
- qml demo分析(maskedmousearea-异形窗口)
一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...
- qml demo分析(objectlistmodel-自定义qml数据)
一.效果展示 如图1所示,是一个ListView窗口,自定义了文本内容和项背景色. 图1 ListView 二.源码分析 代码比较简单,主要使用了QQmlContext类的setContextProp ...
- qml demo分析(photosurface-图片涅拉)
阅读qml示例代码已有一小段时间,也陆续的写了一些自己关于qml示例代码的理解,可能由于自己没有大量的qml开发经验,总感觉复杂的ui交互qml处理起来可能会比较棘手,但事实总是会出人意料,今天我们就 ...
- qml demo分析(maroon-小游戏)
1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1 游戏开始 图2 游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...
- qml demo分析(externaldraganddrop-拖拽)
一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...
- qml demo分析(threading-线程任务)
一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...
- qml demo分析(samegame-拼图游戏)
一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...
- qml demo分析(customgeometry-贝塞尔曲线)
一.效果展示 本篇文章还是带来一个简单的qt示例分析,且看图1效果. 图1 贝塞尔曲线 二.源码分析 该示例代码所在目录quick\scenegraph\customgeometry,感兴趣的同学可以 ...
随机推荐
- ratelimit.go
// The ratelimit package provides an efficient token bucket implementation , false } tb.avai ...
- Instrumentation(1)
Instrumentation介绍: JavaInstrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不限于获取J ...
- 在MFC中使用按下按钮出现选择文件对话框,选中一个指定文件,并将其地址显示到指定的编辑框中
其中,我们选择的文件后缀名为.xlsx,以只读和写操作方式,在所有的文件中选择.xlsl文档 CFileDialog dlg(true, _T(".xlsx"), NULL, OF ...
- 【BZOJ 4016】 [FJOI2014]最短路径树问题
题目链接: TP 题解: 我就是个智障.明明是道大水题,硬是拖了6h. 关于这道题我唯一想说的就是,记得更新拆分后的子树大小!!!我就是ZZ恒(QwQ. 代码: #define Troy 10/26 ...
- HEOI2018 游记
day0早上没有跑操,收拾了点东西,带了点吃的,老妈打电话说要给送点厚衣服,好像确实有点冷.上午有考试,说自愿考,然后开到一半就没了,根本没人打啊,打了一道小园丁和老司机,一个一个部分分打,最后T了一 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- php与html实现交互的基本操作
今天我们来实现php与html页面注册和登录的效果.中国有句古话叫: 第一步:我们来了解一些php的基本格式. <?php php代码 ?> 第二步:了解php与js的一些基本区别 我们在 ...
- Linux下网站根目录权限
网站根目录权限遵循: 文件644 文件夹755 权限用户和用户组www-data 如出现文件权限问题时,请执行下面3条命令: chown -R www-data.www-data /usr/local ...
- MySQL(七)DQL之分组查询
一.语法 select 分组函数,分组后的字段from 表[where 筛选条件]group by 分组的字段[having 分组后的筛选][order by 排序列表] 二.特点 分组前筛选:whe ...
- Jmeter----A接口response中body的某一个参数传递给B接口request的body中使用(参数的传递)
示例:将接口"获取待办列表"response中body的id值传递给接口"删除待办"request的body中使用: 操作步骤如下: 第一步:给"获取 ...