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 02 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Python实现的knn算法示例
Jun 14 Python
python中实现字符串翻转的方法
Jul 11 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
python基于property()函数定义属性
Jan 22 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 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
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
PHP PDO操作总结
2014/11/17 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
python字符串的index和find的区别详解
2020/06/20 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
python 下划线的不同用法
2020/10/24 Python
python Scrapy框架原理解析
2021/01/04 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
药品质量检测应届生求职信
2013/11/14 职场文书
会计助理的岗位职责
2013/11/29 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
爱国演讲稿400字
2014/05/07 职场文书
测绘工程专业求职信
2014/07/15 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
python常见的占位符总结及用法
2021/07/02 Python