Qt Quick 之 PathView 具体解释
PathView ,顾名思义,沿着特定的路径显示 Model 内的数据。 Model 能够是 QML 内建的 ListModel 、 XmlListModel ,也能够是在 C++ 中实现的 QAbstractListModel 的派生类。
PathView 恐怕是 Qt Quick 提供的 Model-View 类库中最复杂也最灵活的一个了。
要使用一个 PathView ,至少须要设置 model 、 delegate 、 path 三个属性。
model 、 delegate 假设你学习过 ListView 肯定已经接触过,这里不再细说。 path 是 PathView 的专有特性,它指定 PathView 用来放置 item 的路径。
要使用 PathView 。先要了解 Path 。
版权全部 foruok ,如需转载请注明出处:作者 foruok ,博客 http://blog.csdn.net/foruok 。
Path
西安是十三朝古都,尽管尿骚味非常重,还是值得一游。于是你从杭州的武陵广场出发,准备去看兵马俑。
先打的去萧山机场,步行进入航站楼,过安检。坐飞机到咸阳机场,出站,乘机场大巴到火车站,然后坐游 5 公交到兵马俑……在这个过程中。换乘的中间点非常多,相邻两个中间点之间的,就是路径段;多个路径段终于形成了从杭州武陵广场到西安临潼兵马俑之间的路径;武陵广场是起点。兵马俑是终点。
在 Qt 中 Path 就是直译为路径。一个路径是由多个路径元素组成的,从起点開始。首尾衔接。抵达终点。
Path 的属性 startX 、 startY 描写叙述路径起点。 pathElements 属性是个列表,是默认属性。它保存组成路径的多个路径元素,常见的路径元素有 PathLine 、 PathQuad 、 PathCubic 、 PathArc 、 PathCurve 、 PathSvg 。
路径上最后一个路径元素的终点就是整个路径的终点,假设终点与起点重合。那么 Path 的 closed 属性就为 true 。
路径元素除 PathSvg 外。都有 x 、 y 属性,以绝对坐标的形式指定本段路径的终点;而起点呢。就是前一个路径段的终点;第一个路径段的起点。就是 Path 的 startX 、 startY 所描写叙述的整个路径的起点。另外还有 relativeX 、 relativeY 两个属性,以相对于起点的相对坐标的形式来指定终点。你还能够混合使用绝对坐标与相对坐标,比方使用 x 和 relativeY 来决定路径段的终点。
PathLine
Path {
startX: 0;
startY: 0;
PathLine {
x: root.width - 1;
y: root.height - 1;
}
}
PathQuad
在 Qt Quick 的 Path 主题中,提供了基于二次方贝塞尔曲线和三次方贝塞尔曲线的路径元素。
在我们使用 Canvas 进行 2D 画图时。 Context2D 对象的 quadraticCurveTo(real cpx, real cpy, real x, real y) 方法能够在路径中加入一条二次方贝塞尔曲线, bezierCurveTo(real cp1x, real cp1y, real cp2x, real cp2y, real x, real y) 方法用来在路径中加入一条三次方贝塞尔曲线。
PathQuad 元素定义一条二次贝塞尔曲线作为路径段。它的起点为上一个路径元素的终点(或者路径的起点)。终点由 x 、 y 或 relativeX 、 relativeY 定义,控制点由 controlX 、 controlY 或 relativeControlX 、 relativeControlY 来定义。
一个简单的二次方贝塞尔路径定义:
Path {
startX: 0;
startY: 0;
PathQuad {
x: root.width - 1;
y: root.height - 1;
controlX: 0;
controlY: root.height - 1;
}
}
在 Qt Quick 中, Path 尽管描写叙述了一条路径。但它是不可见的,不够形象化。
这里我们通过使用 Canvas 来绘制相同的曲线。以求大家看了能够有个直观的印象。上面的路径定义,相应 qml 代码:
import QtQuick 2.0
import QtQuick.Controls 1.1 Canvas {
width: 320;
height: 240; onPaint: {
var ctx = getContext("2d");
ctx.lineWidth = 2;
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.quadraticCurveTo(0, height - 1, width - 1, height - 1);
ctx.stroke();
} Text {
anchors.centerIn: parent;
font.pixelSize: 20;
text: "quadratic Bezier curve";
}
}
运行 "qmlscene pathQuad_canvas.qml" 命令,能够看到下图的效果:
PathCubic
import QtQuick 2.0
import QtQuick.Controls 1.1 Canvas {
width: 320;
height: 240;
id: root; onPaint: {
var ctx = getContext("2d");
ctx.lineWidth = 2;
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(16, 16);
ctx.bezierCurveTo(0, height - 1, width -1, height / 2, width - 16, height - 16);
ctx.stroke();
} Text {
anchors.centerIn: parent;
font.pixelSize: 20;
text: "cubic Bezier curve";
} Rectangle {
width: 32;
height: 32;
radius: 16;
color: "blue";
id: ball; MouseArea {
anchors.fill: parent;
id: mouseArea;
onClicked: pathAnim.start();
} PathAnimation {
id: pathAnim;
target: ball;
duration: 3000;
anchorPoint: "16,16";
easing.type: Easing.InCubic;
path: Path {
startX: 16;
startY: 16;
PathCubic {
x: root.width - 16;
y: root.height - 16;
control1X: 0;
control1Y: root.height - 1;
control2X: root.width - 1;
control2Y: root.height / 2;
}
}
}
}
}
如你所见。这次我使用 PathAnimation 来演示 PathCubic 的使用方法,请查看改动画元素的 API 文档。
我在 Canvas 的 onPaint() 方法中使用 bezierCurveTo() 绘制了一个三次方贝塞尔曲线。为的是能让你看见这个曲线究竟什么模样。
我定义了一个 Rectangle 对象,长宽各为 32 。设置其 radius 为 16 ,实际上就是个圆形。然后定义了 PathAnimation 对象,设置其 Path 为三次方贝塞尔曲线,与 onPaint() 方法绘制曲线所用參数全然一致;另外设置了 anchorPoint 为 ball 的中心点。 MouseArea 对象在鼠标左键点击时启动动画。
运行 "qmlscene pathCubic_canvas.qml" ,鼠标点击蓝色的圆圈,动画就開始咧。下图是运行中的截图:
PathArc
PathArc 路径元素定义一条弧线,它的起点为上一个路径元素的终点(或者路径的起点),终点由 x 、 y 或 relativeX 、 relativeY 定义。
弧线的半径由 radiusX 、 radiusY 定义。
PathAttribute
PathAttribute { name: "zOrder"; value: 0.2; }
name 属性指定待定义属性的名字, real 类型的 value 属性的值为待定义的属性的值。
PathAttribute 放在某个路径段的前面,指明这段路径起始时的属性值。路径段后面的 PathAttribute 指明路径段终止时的属性值;而在路径段上的属性值, Path 会依据起、止值自己主动插值计算。
我们能够通过使用 PathAttribute 来定义一些属性,用于控制分布在路径上的 item 的外观。
比方定义名为 "zOrder" 的属性。控制沿路径分布的 item 的 Z 序。
以下是个简单的演示样例:
Path {
startX: 10;
startY: 100;
PathAttribute { name: "zOrder"; value: 0 }
PathAttribute { name: "itemAlpha"; value: 0.1 }
PathAttribute { name: "itemScale"; value: 0.6 }
PathLine {
x: root.width/2 - 40;
y: 100;
}
PathAttribute { name: "zOrder"; value: 10 }
PathAttribute { name: "itemAlpha"; value: 0.8 }
PathAttribute { name: "itemScale"; value: 1.2 }
PathLine {
relativeX: root.width/2 - 60;
relativeY: 0;
}
PathAttribute { name: "zOrder"; value: 0 }
PathAttribute { name: "itemAlpha"; value: 0.1 }
PathAttribute { name: "itemScale"; value: 0.6 }
}
我把路径分成了两段,起点是 (10, 100) 。为路径定义了三个属性。 zOrder 、 itemAlpha 、 itemScale ,在 PathView 的 delegate 中会用到这些属性。以 zOrder 属性为例,起点处值为 0 。中间值为 1 ,终点值为 0 ,其他的。 Path 会自己主动依据两端的值来生成。
PathAttribute 定义的属性,会导出为 delegate 的顶层 item 的附加属性。通过 PathView.${name} 的形式来訪问。
比方 zOrder 属性,在 delegate 中使用 PathView.zOrder 訪问。
PathPercent
PathPercent 的 value 属性为 real 值。范围 0.0 至 1.0 。须要注意的是。在一个 Path 中使用 PathPercent ,PathPercent 元素的 value 值是递增的,某一段路径假设在两个 PathPercent 之间,那么这段路径上面放置的 item 数量占路径上总 item 数量的比率。是后面的 PathPercent 与 前面的 PathPercent 的 value 之差。
以下是个简单的演示样例:
Path {
startX: 10;
startY: 100;
PathLine {
x: root.width/2 - 40;
y: 100;
}
PathPercent { value: 0.28; }
PathLine {
relativeX: root.width/2 - 60;
relativeY: 0;
}
}
第一个路径段上放置的 item 数量占路径上总 item 数的 28% 。结合实例会看到左边矩形稀疏、右边紧凑这种效果。
PathView
像 ListView 一样, PathView 有一个 count 属性。保存 PathView 要显示的 item 总数。
另外 PathView 另一个 pathItemCount 属性,指定在路径上可见的 item 数量,它能够与 count 不同。
preferredHighlightBegin 和 preferredHighlightEnd 属性的值是 real 类型的。范围 0.0 至 1.0 。preferredHighlightBegin 指定当前 item 在 view 中的首选起始位置, preferredHighlightEnd 指定当前 item 在 view 中的首选结束位置。与它们相关的,另一个 highlightRangeMode 属性,能够取值 PathView.NoHighlightRange 、 PathView.ApplyRange 或 PathView.StrictlyEnforceRange 。比方我们想严格地将当前 item 限制在路径的中央,能够设置 highlightRangeMode 为 PathView.StrictlyEnforceRange ,设置 preferredHighlightBegin 和 preferredHighlightEnd 都为 0.5 。
highlight 属性指定为当前 item 绘制高亮效果的组件。
PathView 像 Flickable 一样,当用户拖动 view 时。具有弹簧效果。 interactive 属性设置为 true ,用户就能够拖动 PathView ,假设产生了弹动, flicking 会变为 true 。
flickDeceleration 属性设置弹簧效果的衰减速率,默认值为 100 。
decrementCurrentIndex() 、 incrementCurrentIndex() 两个方法能够递减、递增 PathView 维护的当前 item 的索引。这两个函数有循环效果。假设你不须要,能够自己改动 currentIndex 属性来实现你的逻辑。
PathView 还向 delegate 导出了 isCurrentItem(布尔值) 、onPath(布尔值) 、 view 三个附加属性。
在 delegate 的顶层 item 内使用 PathView.isCurrentItem 能够获知本 item 是否为 PathView 的当前 item ;使用 PathView.onPath 则能够知道本 item 是否在路径上; PathView.view 则指向 item 所属的 PathView 实例,你能够通过它来訪问 PathView 的方法、属性、信号等。
有关 PathView 的很多其他细节。请研读 Qt 帮助中有关 PathView 的文档,如今该来看一个 PathView 的实例了。以下是 pathview_simple.qml :
import QtQuick 2.0
import QtQuick.Controls 1.1 Rectangle {
width: 480;
height: 300;
color: "black";
id: root; Component {
id: rectDelegate;
Item {
id: wrapper;
z: PathView.zOrder;
opacity: PathView.itemAlpha;
scale: PathView.itemScale;
Rectangle {
width: 100;
height: 60;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1);
border.width: 2;
border.color: wrapper.PathView.isCurrentItem ? "red" : "lightgray";
Text {
anchors.centerIn: parent;
font.pixelSize: 28;
text: index;
color: Qt.lighter(parent.color, 2);
}
}
}
} PathView {
id: pathView;
anchors.fill: parent;
interactive: true;
pathItemCount: 7;
preferredHighlightBegin: 0.5;
preferredHighlightEnd: 0.5;
highlightRangeMode: PathView.StrictlyEnforceRange; delegate: rectDelegate;
model: 15; path:Path {
startX: 10;
startY: 100;
PathAttribute { name: "zOrder"; value: 0 }
PathAttribute { name: "itemAlpha"; value: 0.1 }
PathAttribute { name: "itemScale"; value: 0.6 }
PathLine {
x: root.width/2 - 40;
y: 100;
}
PathAttribute { name: "zOrder"; value: 10 }
PathAttribute { name: "itemAlpha"; value: 0.8 }
PathAttribute { name: "itemScale"; value: 1.2 }
PathLine {
relativeX: root.width/2 - 60;
relativeY: 0;
}
PathAttribute { name: "zOrder"; value: 0 }
PathAttribute { name: "itemAlpha"; value: 0.1 }
PathAttribute { name: "itemScale"; value: 0.6 }
} focus: true;
Keys.onLeftPressed: decrementCurrentIndex();
Keys.onRightPressed: incrementCurrentIndex();
}
}
我定义了一个非常easy的 delegate :在带边框的矩形内显示 item 索引。 delegate 的顶层 item 使用了路径内通过 PathAttribute 定义的 zOrder 、itemAlpha 、 itemScale 等附加属性来控制 item 的大小、透明度。
Rectangle 对象的颜色随机生成。边框则通过 isCurrentItem 附加属性来分别设置,注意附加属性仅仅在顶层 item ,即 wrapper 内能够直接訪问,所以 Rectangle 内使用 wrapper.PathView.isCurrentItem 来訪问。
model 更简单,仅仅给了个数字。
path 对象在 PathAttribute 一节介绍过了。
focus 设置为 true ,是为了处理按键事件。
左右方向键能够循环浏览 PathView 内的 item 。
我设置路径上可见的 item 数量为 7 。当前 item 保持在路径中央。
运行 "qmlscene pathview_simple.qml" 命令,效果下图所看到的:
这是把路径分为两个路径元素而且将 PathAttribute 定义 的zOrder 属性应用在 delegate 上的效果。你能够去掉 zOrder 属性声明及相关的语句看看效果。
当然你也能够改动 itemAlpha 、 itemScale 两个属性来试试。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
没错。当前选中的 item 以及它的高亮框被挡住了嗳。
调整下 preferredHighlightBegin 属性。设置其值为 0.3 ,再来看下图:
版权全部 foruok 。如需转载请注明出处:作者 foruok ,博客 http://blog.csdn.net/foruok 。
PathView 还有非常多其他属性,使用到时请自行研究 Qt 帮助。
Qt Quick 之 PathView 具体解释的更多相关文章
- Qt Quick之StackView具体解释(1)
Qt Quick中有个StackView.我在<Qt Quick核心编程>一书中没有讲到.近期有人问起,趁机学习了一下,把它的基本使用方法记录下来. 我准备分两次来讲.第一次讲主要的使用方 ...
- Qt Quick之StackView具体解释(2)
在"StackView具体解释(1)"中,我们学习了StackView的基本使用方法,这次呢,我们来讲delegate的定制.被管理的View的生命周期.查找View等主题. 本文 ...
- Qt Quick实现的涂鸦程序
之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...
- Qt Quick综合实例之文件查看器
假设你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以Applicat ...
- Qt Quick实现的疯狂算数游戏
使用 Qt Quick 写了个小游戏:疯狂算数.支持 Windows 和 Android 两个平台. 游戏简单,但牵涉到下面你的 Qt Quick 主题: 自己实现一个按钮 自适应分辨率 国际化 QM ...
- Qt on Android: Qt Quick 之 Hello World 图文具体解释
在上一篇文章,<Qt on Android:QML 语言基础>中,我们介绍了 QML 语言的语法,在最后我们遗留了一些问题没有展开,这篇呢,我们就正式開始撰写 Qt Quick 程序,而那 ...
- Qt Quick 组件和动态创建的对象具体的解释
在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...
- Qt Quick 之 QML 与 C++ 混合编程具体解释
Qt Quick 技术的引入.使得你能够高速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的.也有非常多局限性,原来 Qt 的一些技术,比方低阶的网络编程如 QTcpSocke ...
- Qt 学习之路 :Qt Quick Controls
自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位.很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮.菜单等.虽然移动领域,这些组件已经变 ...
随机推荐
- 10.Intellij IDEA svn的使用详解
转自:https://www.2cto.com/kf/201703/614858.html 首先提一句,IDEA对各种的版本控制工具的支持是非常好的,打开系统设置界面,就可以看到他有专门的一栏 Ver ...
- bzoj1293 [SCOI2009] 生日礼物 队列
题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在 ...
- bzoj2124 等差子序列(树状数组+hash)
题意 给你一个1~n排列,问有没有一个等差数列(长度至少为3) 题解 我居然自己想到了正解. 但我最后写挂了,所以我又看了题解. 我们维护了一个以权值为下标的01序列. 我们扫描整个序列.对于每一个正 ...
- CF245H Queries for Number of Palindromes(回文树)
题意翻译 题目描述 给你一个字符串s由小写字母组成,有q组询问,每组询问给你两个数,l和r,问在字符串区间l到r的字串中,包含多少回文串. 输入格式 第1行,给出s,s的长度小于5000 第2行给出q ...
- unity调用Android的两种方式:其二,调用aar包
上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...
- ArcGIS api for javascript——地理编码任务-反向地理编码
描述 反向地理编码确定地图上给出点的地址.本例展示了如何通过ArcGIS JavaScript API做反向地理编码. 反向地理编码和常规的地理编码请求都使用Locator类和ArcGIS Serve ...
- ArcGIS api for javascript——鼠标悬停时显示信息窗口
描述 本例展示当用户在要素上悬停鼠标时如何显示InfoWindow.本例中,要素是查询USA州图层的QueryTask的查询结果.工作流程如下: 1.用户单击一个要素 2.要素是“加亮的”图形. 3. ...
- ArcGIS api for javascript——合并两个ArcGIS Online服务
描述 这个示例创建一个地图并ArcGIS Online增加连个图层到地图.ArcGIS Online是由ESRI体提供的一组切片地图服务,可以用来通过高质量的地图和数据增强应用.这个示例增加影像和运输 ...
- 【python下使用OpenCV实现计算机视觉读书笔记2】图像与字节的变换
import cv2 import numpy import os # Make an array of 120,000 random bytes. randomByteArray = bytearr ...
- Activity的launchMode和任务栈小结
对Activity的launchMode的理解一直没有好好总结下,这两天系统总结下launchMode的使用方法: Activity的launchMode属性决定了Activity和应用程序当前任务栈 ...