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实现博客文章爬虫示例
Feb 26 Python
python实现中文输出的两种方法
May 09 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
Python 多维List创建的问题小结
Jan 18 Python
浅谈python新式类和旧式类区别
Apr 26 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
如何在django中添加日志功能
Feb 06 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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中的Class的几点个人看法
2006/10/09 PHP
请php正则走开
2008/03/15 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
微信小程序实现星星评价效果
2018/11/02 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
Python的一些用法分享
2012/10/07 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Python正则表达式知识汇总
2017/09/22 Python
详解python 注释、变量、类型
2018/08/10 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
个人简历中的自我评价范例
2013/10/29 职场文书
四好少年事迹材料
2014/01/12 职场文书
房地产开盘策划方案
2014/02/10 职场文书
幼儿园新年寄语
2014/04/03 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
创先争优承诺书
2015/01/20 职场文书
三孔导游词
2015/02/05 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
MySQL 时间类型的选择
2021/06/05 MySQL