当前位置: 首页 > 编程日记 > 正文

Qt 学习之路:模型-视图高级技术

PathView

PathView是 QtQuick 中最强大的视图,同时也是最复杂的。PathView允许创建一种更灵活的视图。在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局。沿着同一布局路径,数据项的属性可以被更详细的设置,例如缩放、透明度等。

使用PathView首先需要定义一个代理和一个路径。除此之外,PathView还可以设置很多其它属性,其中最普遍的是pathItemCount,用于设置可视数据项的数目;preferredHighlightBeginpreferredHighlightEndhighlightRangeMode可以设置高亮的范围,也就是沿着路径上面的当前可以被显示的数据项。

在深入了解高亮范围之前,我们必须首先了解path属性。path接受一个Path元素,用于定义PathView中的代理所需要的路径。该路径使用startXstartY属性,结合PathLinePathQuadPathCubic等路径元素进行定义。这些元素可以结合起来形成一个二维路径。

一旦路径定义完成,我们可以使用PathPercentPathAttribute元素进行调整。这些元素用于两个路径元素之间,更好的控制路径和路径上面的代理。PathPercent控制两个元素之间的路径部分有多大。它控制了路径上面代理的分布,这些代理按照其定义的百分比进行分布。

PathAttribute元素同PathPercent同样放置在元素之间。该元素允许沿路径插入一些属性值。这些属性值附加到代理上面,可用于任何能够使用的属性。

下面的例子演示了如何利用PathView实现卡片的弹入。这里使用了一些技巧来达到这一目的。它的路径包含三个PathLine元素。通过PathPercent元素,中间的元素可以正好位于中央位置,并且能够留有充足的空间,以避免被别的元素遮挡。元素的旋转、大小缩放和 Z 轴都是由PathAttribute进行控制。除了定义路径,我们还设置了PathViewpathItemCount属性。该属性用于指定路径所期望的元素个数。最后,代理中的PathView.onPath使用preferredHighlightBeginpreferredHighlightEnd属性控制代理的可见性。

代理直接使用了通过PathAttribute元素附加的itemZitemAngleitemScale属性。需要注意的是,被附加到代理的属性只能在wrapper中使用。因此,我们又定义了一个rotX属性,以便在内部的Rotation元素中使用。另一点需要注意的是附件属性PathView.onPath的使用。通常我们会将这个属性绑定到可视化属性,这样允许PathView保留非可见元素,以便进行缓存。如果不这样设置,不可见元素可能会由于界面裁剪等原因被销毁,因为PathViewListViewGridView要灵活得多,所以为提高性能,一般会使用这种绑定实现缓存。

示例运行结果如下:

PathView

完成PathView中图片和一些复杂元素的变换之后,通常会进行一定的性能优化,比如,将Image元素的smooth属性绑定到PathView.view.moving附加属性。这意味着在移动时,图片质量会稍有下降,静止时恢复正常。在视图移动时,很少有用户会在意图片的清晰度,因此,这样的妥协一般是可以接受的。

从 XML 加载模型

XML 是一种非常常见的数据格式,QML 提供了XmlListModel元素支持将 XML 数据转换为模型。XmlListModel可以加载本地或远程的 XML 文档,使用 XPath 表达式处理数据。

下面的例子给出了如何从 RSS 获取图片。source属性指向了一个远程地址,其数据会被自动下载下来。

当数据被下载下来,这个 XML 就被处理成模型的数据项和角色。query属性是 XPath 表达式语言,用于创建模型数据项。在这个例子中,该属性值为/rss/channel/item,因此,rss 标签下的每一个 channel 标签中的每一个 item 标签,都会被生成一个数据项。每一个数据项都可以定义一系列角色,这些角色使用XmlRole表示。每一个角色都有一个名字,代理可以使用附件属性访问到其值。角色的值是使用 XPath 表达式获取的。例如,title属性的值由title/string()表达式决定,返回的是<title></title>标签之间的文本。imageSource属性值则更有趣。它并不是直接由 XML 获取的字符串,而是一系列函数的运算结果。在返回的 XML 中,有些 item 中包含图片,使用<img src=标签表示。使用substring-aftersubstring-beforeXPath 函数,可以找到每张图片的地址并返回。因此,imageSource属性可以直接作为Image元素的source属性值。

分组列表

有时,列表中的数据可以分成几个部分,例如,按照列表数据的首字母分组。利用ListView可以将一个扁平的列表分为几个组,如下图所示:

ListView 分组

为了使用分组,需要设置section.propertysection.criteria两个属性。section.property定义了使用哪个属性进行分组。这里,需要确保模型已经排好序了,以便每一部分能够包含连续的元素,否则,同一属性的名字可能出现在多个位置。section.criteria的可选值为ViewSection.FullStringViewSection.FirstCharacter。前者为默认值,适用于具有明显分组的模型,例如,音乐集等;后者按照属性首字母分组,并且意味着所有属性都适用于此,常见例子是电话本的通讯录名单。

一旦分组定义完毕,在每一个数据项就可以使用附加属性ListView.sectionListView.previousSectionListView.nextSection访问到这个分组。使用这个属性,我们就可以找到一个分组的第一个和最后一个元素,从而实现某些特殊功能。

我们也可以给ListViewsection.delegate属性赋值,以便自定义分组显示的代理。这会在一个组的数据项之前插入一个用于显示分组的代理。这个代理可以使用附加属性访问当前分组的名字。

下面的例子按照国别对一组人进行分组。国别被设置为section.property属性的值。section.delegate组件,也就是sectionDelegate,用于显示每组的名字,也就是国家名。每组中的人名则使用spaceManDelegate显示。

关于性能

模型视图的性能很大程度上取决于创建新的代理所造成的消耗。例如,如果clip属性设置为false,当向下滚动ListView时,系统会在列表末尾创建新的代理,并且将列表上部已经不可显示的代理移除。显然,当初始化代理需要消耗大量时间时,用户在快速拖动滚动条时,这种现象就会造成一定程度的影响。

为了避免这种情况,你可以调整被滚动视图的外边框的值。通过修改cacheBuffer属性即可达到这一目的。在上面所述的有关竖直滚动的例子中,这个属性会影响到列表上方和下方会有多少像素。这些像素则影响到是否能够容纳这些代理。例如,将异步加载图片与此结合,就可以实现在图片真正加载完毕之后才显示出来。

更多的代理意味着更多的内存消耗,从而影响到用户的操作流畅度,同时也有关代理初始化的时间。对于复杂的代理,上面的方法并不能从根本上解决问题。代理初始化一次,其内容就会被重新计算。这会消耗时间,如果这个时间很长,很显然,这会降低用户体验。代理中子元素的个数同样也有影响。原因很简单,移动更多的元素当然要更多的时间。为了解决前面所说的两个问题,我们推荐使用Loader元素。Loader元素允许延时加载额外的元素。例如,一个可展开的代理,只有当用户点击时,才会显示这一项的详细信息,包含一个很大的图片。那么,利用Loader元素,我们可以做到,只有其被显示时才进行加载,否则不加载。基于同样的原因,应该使每个代理中包含的 JavaScript 代码尽可能少。最好能做到在代理之外调用复杂的 JavaScript 代码。这将减少代理创建时编译 JavaScript 所消耗的时间。

转载于:https://www.cnblogs.com/lvdongjie/p/4811582.html

相关文章:

3.7Python数据处理篇之Numpy系列(七)---Numpy的统计函数

目录 目录前言&#xff08;一&#xff09;函数一览表&#xff08;二&#xff09;统计函数1&#xff08;三&#xff09;统计函数2目录 前言 具体我们来学Numpy的统计函数 &#xff08;一&#xff09;函数一览表 调用方式&#xff1a;np.* .sum(a)对数组a求和.mean(a)求数学期望.…

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图&#xff1a; 处理后&#xff1a; 下面贴代码&#xff1a; 一、图片处理层&#xff1a; package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.gra…

JAVA动态读取xml_Java动态生成和解析xml文件步骤详解

packageday12;importjava.io.FileInputStream;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;/*** 使用DOM4J解析XML文档*authortarena**/public classParseXMLDemo {public static voidmai…

C++基础知识(二)

八、 继承&#xff1a;让某个类的对象获得另一个类的对象的特性。通过继承可实现代码重用&#xff0c;即从已存在的类派生出的一个新类将自动具有原来那个类的特性。 类的继承还具有&#xff1a;(1)单向性&#xff1b;A类为B类的基类&#xff08;父类&#xff09;&#xff0c;则…

Spring MVC 学习笔记 对locale和theme的支持

Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 Accept-Language 来确定访客的local。对于前端jsp页面上&#xff0c;spring提供了标签<spring:message>来提供从resource文件中获取的文字的动…

iOS逆向(4)-代码注入,非越狱窃取微信密码

利用LLDB对微信进行分析&#xff0c;然后利用分析的结果&#xff0c;再逐步讲解如何Hook微信的登录过程&#xff0c;截获微信密码。 在上一篇文章(APP重签名)中&#xff0c;已经介绍了如何对APP重签名&#xff0c;并且利用XCode将微信跑起来&#xff0c;既然到了这一步&#xf…

java http请求 工具类_Java 实现 Http 请求工具类

1 packagecom.demo.util;23 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.OutputStreamWriter;7 importjava.net.URL;8 importjava.net.URLConnection;910 public classHttpUtil {11 /**12 * 向指定URL发送GE…

Entity Framework学习三:查询、插入、更新和删除操作

1.LINQ过滤数据 var query from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery context.People.Where(p > p.FirstName.StartsWith("a")); 两种不同的写法&#xff0c;效果一样。 多条件组合查找…

c/s开发基础自学纪录为主

1&#xff0e;常用属性 &#xff08;1&#xff09;Name属性&#xff1a;用来获取或设置窗体的名称。 &#xff08;2&#xff09;WindowState属性&#xff1a;用来获取或设置窗体的窗口状态。 &#xff08;3&#xff09;StartPosition属性&#xff1a;用来获取或设置运行时窗体的…

不错的威盾PHP加密专家解密算法

<?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn ***********************************/ $filename"phpfilename.php";//要解密的文件 $lines file($filename);//0,1,2行 //第一次base64解密 $content"&quo…

java网络编程udp_java网络编程 UDP网络编程问题

为什么我的代码运行后&#xff0c;黑窗口&#xff0c;不显示一端发来的数据&#xff0c;而是黑窗口打印很多空格&#xff1f;请帮一下&#xff0c;初学者&#xff01;谢谢&#xff0c;下面是二个具有发送和接受功能的代码&#xff1f;发送端————importjava.net.*;imp...为什…

权限组件(10):三级菜单的展示和增删改查

效果图&#xff1a; 三级菜单的实现和一级、二级菜单差不多。需要注意的是增加三级菜单时&#xff0c;三级菜单是用户提交后在后台通过二级菜单的id添加的。 一、路由分发 rbac/urls.py ... from django.urls import re_pathfrom rbac.views import menu ...urlpatterns [...…

ROS知识(4)----初级教程之常见问题汇总

一、开机启动ROS的工作空间的路径设置失败 现象&#xff1a;在教程&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage中的第5.1小节&#xff0c;运行以下命令失败&#xff1a; $ rospack depends1 beginner_tutorials 提示错误&#xff1a;[rospack] Error: …

sql server 海量数据速度提升:SQL优化-索引(11) 【转】

12、高效的TOP 事实上&#xff0c;在查询和提取超大容量的数据集时&#xff0c;影响数据库响应时间的最大因素不是数据查找&#xff0c;而是物理的I/0操作。如&#xff1a; select top 10 * from ( select top 10000 gid,fariqi,title from tgongwen where neibuyonghu办公室or…

java重定向带参数_急 求助重新封装重定向带参数问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的代码 不知道行不行 求助package base.web.resolver.result;import java.util.HashMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.…

Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 写在前面&#xff1a;由于前天项目老师建设局的项目快到验收阶段&#xff0c;所以&#xff0c;前天晚上通宵&#xff0c;昨天睡了大半天&#xff0c;下午我们宿舍聚会&#…

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分

问题描述&#xff1a;假设某个数组中只有数字 1 和 2&#xff0c;进行排序&#xff0c;使得数字 1 位于数组前部分&#xff0c;数字 2 位于后部分。 这道算法题其实不是很难&#xff0c;使用各种排序算法应该都能解出&#xff0c;但是若要考虑性能问题&#xff0c;那就得选择一…

@class和#import

class 作用&#xff1a; 可以简单的引用一个类 简单使用&#xff1a; class Dog; 仅仅是告诉编译器&#xff0c;Dog是一个类&#xff1b;并不会包含Dog这个类的所有内容 具体使用&#xff1a; 在.h文件中使用class引用一个类 在.m文件中使用#import包含这个类的.h文件 作用上的…

java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

C# 汉字编码GB2312转换

功能界面 源码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace wordsConvert {public partial class Fo…

python批量爬取文档

最近项目需要将批量链接中的pdf文档爬下来处理&#xff0c;根据以下步骤完成了任务&#xff1a; 将批量下载链接copy到text中&#xff0c;每行1个链接&#xff1b;再读txt文档构造url_list列表&#xff0c;利用readlines返回以行为单位的列表&#xff1b;利用str的rstrip方法&a…

[Android]webview直接加载网页允许JS,进度条,当前应用内跳转

webview&#xff0c;用于在应用里面直接加载网页本代码参考了&#xff1a;官方的webview实例介绍&#xff1a;https://developer.android.com/guide/tutorials/views/hello-webview.html 加上进度条&#xff1a; http://blog.csdn.net/stoneson/article/details/6068089 整个源…

ubuntu 14.04 安装java_Ubuntu 14.04中安装Java

第三&#xff1a;在Ubuntu 和 Linux Mint上安装Java看了各种类型"java";的不同之后&#xff0c;让我们看如何安装他们。1)在Ubuntu和Linux Mint上安装JRE打开终端&#xff0c;使用下面的命令安装JRE&#xff1a;sudo apt-get install default-jre2)在Ubuntu和Linux M…

C# 生成系统唯一号

生成唯一号&#xff1a;思路&#xff0c;根据yymmddhhmmss自增长号唯一服务器号( SystemNo)生成唯一码&#xff0c;总长度19&#xff0c;例如&#xff1a;1509281204550000101. public class UniqueNumber{private static long num 0;//流水号private static object lockObj …

EBS上用过的一些接口表整理信息

AP接口表&#xff1a;AP_INVOICES_INTERFACEAP_INVOICE_LINES_INTERFACE涉及的请求&#xff1a;应付款管理系统开放接口导入涉及案例&#xff1a; 运费导AP、费用导APPO接口表&#xff1a;申请&#xff1a;PO_REQUISITIONS_INTERFACE_ALL涉及请求&#xff1a;导入申请采购&…

linux源码编译安装nginx

1.从nginx的官方网站下载nginx的安装源码包&#xff0c;要下载.gz格式的包才是linux安装包 网址http://nginx.org/download/ wget http://nginx.org/download/nginx-1.5.9.tar.gz 2.解压 tar -zxvf nginx-1.5.9.tar.gz yum -y install pcre-devel gcc gcc-c autoconf automak…

usr share里没有mysql_无法在ubuntu 12.04上安装mysql,找不到消息文件’/usr/share/mysql/errmsg.sys’...

尝试使用apt-get安装mysql但它失败了# apt-get install MysqL-serverReading package lists... DoneBuilding dependency treeReading state information... DoneThe following extra packages will be installed:MysqL-server-5.5Suggested packages:tinycaThe following NEW …

android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色...

1.更改PagerTabStrip背景颜色我们直接在布局中设置background属性可以&#xff1a;<android.support.v4.view.ViewPagerandroid:id"id/pager"android:layout_width"fill_parent"android:layout_height"fill_parent" ><android.support.…

敏捷开发日常跟进系列之二:燃尽图(中)

这是敏捷开发日常跟进系列的第二篇&#xff08;栏目目录&#xff09;。 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标&#xff0c;迭代的目标是什么呢&#xff1f; 1. 按产品经理的要求&#xff0c;交付计划会中计划的用户故事 2. 尽量完成1 之后还会看到&#xff0c;这个…

[python][jupyter notebook]之菜鸟安装[pyecharts]中Geo或Map显示问题

作为菜鸟&#xff0c;在学习使用pyecharts模块进入jupyter notebook的时候&#xff0c;又遇到了问题——那就是&#xff0c;可以使用一下代码&#xff0c;导入Geo和Map模块&#xff0c;但是弄了之后看不见地图。 from pyecharts import Geo from pyecharts import Map 所以&…