QML用PathView实现轮播图


Posted in Python onJune 03, 2020

轮播图是一个常见的功能,在QML中,可以使用PathView来实现一个循环播放的轮播图组件。

默认情况,如果限制了加载个数,切换时第一帧会马上消失,第二帧才进入,这样会有断档的感觉。通过设置PathView中preferredHighlightBegin/End为0.5,这样当前选定的项位于路径的中间,就没有断档的感觉了。效果如下(为了测试,我没有clip,clip之后只有范围内的才可见):

QML用PathView实现轮播图

//CircleView.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
 
//轮播图
Item {
 id: control
 
 property int indicatorWidth: 12
 
 //定时切换间隔
 property alias timerInterval: path_timer.interval
 //切换动画执行时间
 property alias pathDuration: path_view.highlightMoveDuration
 property alias delegate: path_view.delegate
 property alias model: path_view.model
 //页数
 property alias count: path_page.count
 
 PathView{
 id: path_view
 anchors.fill: parent
 
 //此属性保存任何时候在路径上可见的项目数。
 //将pathItemCount设置为undefined将显示路径上的所有项目。
 //因为path代码的问题,设置为2最合适
 pathItemCount: 2
 
 //测试时,把clip去掉就能看到完整的
 //clip: true
 
 //向前移动,即顺序0 1 2 3
 movementDirection: PathView.Positive
 
 //切换的时间
 highlightMoveDuration: 1000
 
 //视图中突出显示(当前项目)的首选范围,默认值PathView.StrictlyEnforceRange
 //配合preferredHighlight的范围0.5 0.5,就能显示在正中,切换更自然
 //highlightRangeMode: PathView.StrictlyEnforceRange
 
 //希望当前选定的项位于路径的中间,则将突出显示范围设置为0.5,0.5
 preferredHighlightBegin: 0.5
 preferredHighlightEnd: 0.5
 path: Path {
  startX: -path_view.width/2
  startY: path_view.height / 2
 
  PathLine {
  x: path_view.pathItemCount * path_view.width-path_view.width / 2
  y: path_view.height / 2
  }
 }
 onModelChanged: {
  if(path_timer.running){
  path_timer.restart();
  }
 }
 
 //测试用
 //model: ["red","green","blue"]
 //delegate: Rectangle{
 // width: path_view.width
 // height: path_view.height
 // color: modelData
 //}
 }
 //定时切换
 Timer{
 id: path_timer
 running: control.visible
 repeat: true
 interval: 3000
 onTriggered: {
  //至少两个才切换
  if(path_view.count>1)
  path_view.currentIndex=(path_view.currentIndex+1)%path_view.count
 }
 }
 //右下角小圆圈
 PageIndicator {
 id: path_page
 anchors{
  right: parent.right
  bottom: parent.bottom
  margins: 30
 }
 count: path_view.count
 currentIndex: path_view.currentIndex
 spacing: control.indicatorWidth
 delegate: Rectangle{
  width: control.indicatorWidth
  height: width
  radius: width/2
  color: "white"
  //非当前页就灰色
  opacity: index===path_page.currentIndex?1:0.6
  Behavior on opacity {
  OpacityAnimator{
   duration: 200
  }
  }
  //点击跳转到该页
  //还有问题,非连续的item,他会快速连续切换到目标index
  //因为不是直接切换,有闪烁的感觉
  MouseArea{
  anchors.fill: parent
  onClicked: {
   path_view.currentIndex=index;
   if(path_timer.running){
   path_timer.restart();
   }
  }
  }
 }
 }
}

//main.qml  

测试了不同的Item个数

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
 
Window {
 visible: true
 width: 700
 height: 500
 title: qsTr("龚建波 1992")
 
 color: "#021B39"
 
 Column{
 anchors.centerIn: parent
 spacing: 10
 CircleView{
  width: 100
  height: 50
  model:["red","green","blue","orange"]
 
  delegate: Rectangle {
  width: 100
  height: 50
  color: modelData
  //Component.onCompleted: console.log(modelData,"completed")
  }
 
  Rectangle{
  anchors.fill: parent
  color: "transparent"
  border.color: "white"
  }
 }
 CircleView{
  width: 100
  height: 50
  model:["red","green","blue"]
 
  delegate: Rectangle {
  width: 100
  height: 50
  color: modelData
  //Component.onCompleted: console.log(modelData,"completed")
  }
 
  Rectangle{
  anchors.fill: parent
  color: "transparent"
  border.color: "white"
  }
 }
 CircleView{
  width: 100
  height: 50
  model:["red","green"]
 
  delegate: Rectangle {
  width: 100
  height: 50
  color: modelData
  //Component.onCompleted: console.log(modelData,"completed")
  }
 
  Rectangle{
  anchors.fill: parent
  color: "transparent"
  border.color: "white"
  }
 }
 CircleView{
  width: 100
  height: 50
  model:["red"]
 
  delegate: Rectangle {
  width: 100
  height: 50
  color: modelData
  //Component.onCompleted: console.log(modelData,"completed")
  }
 
  Rectangle{
  anchors.fill: parent
  color: "transparent"
  border.color: "white"
  }
 }
 CircleView{
  width: 100
  height: 50
 
  delegate: Rectangle {
  width: 100
  height: 50
  color: modelData
  //Component.onCompleted: console.log(modelData,"completed")
  }
 
  Rectangle{
  anchors.fill: parent
  color: "transparent"
  border.color: "white"
  }
 }
 }
}

借鉴:链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中特殊函数集锦
Jul 27 Python
python中字符串类型json操作的注意事项
May 02 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
python 异或加密字符串的实例
Oct 14 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
python函数不定长参数使用方法解析
Dec 14 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Django如何实现防止XSS攻击
Oct 13 Python
Python基于smtplib协议实现发送邮件
Jun 03 #Python
Pytorch环境搭建与基本语法
Jun 03 #Python
如何学习Python time模块
Jun 03 #Python
使用openCV去除文字中乱入的线条实例
Jun 02 #Python
Python能做什么
Jun 02 #Python
什么是Python中的匿名函数
Jun 02 #Python
学习python需要有编程基础吗
Jun 02 #Python
You might like
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
js比较日期大小的方法
2015/05/12 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
Django CBV类的用法详解
2019/07/26 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
python3中确保枚举值代码分析
2020/12/02 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
高中生毕业学习总结的自我评价
2013/11/14 职场文书
教师远程培训感言
2014/03/06 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
2014年督导工作总结
2014/11/19 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技