QML 滑动与翻转效果(Flickable与Flipable)

article/2025/7/14 8:59:47

目录

    • 引言
    • 相关阅读
    • 核心组件解析
      • Flickable基础属性
      • Flipable核心特性
    • 示例解析
      • 示例1:可滑动列表(FlickableDemo)
      • 示例2:可翻转卡片(FlipableCard)
    • 总结
    • 下载链接

引言

Qt Quick 框架提供的 Flickable 与 Flipable 组件,为开发者提供了一套完备的动态界面解决方案。Flickable 组件内置的惯性滚动、边界反弹与内容裁剪机制,能够精准复现原生触控设备的操作手感;而 Flipable 组件则通过可定制的旋转轴心与过渡动画,实现了三维空间变换效果。接下来,本文将通过两个具体实现案例,说明如何使用这2个组件。

相关阅读

  • Flickable官方文档
  • Flipable官方文档

核心组件解析

以下列出示例中用到的属性。

Flickable基础属性

属性名称类型说明
contentWidthreal可滚动内容的总宽度
contentHeightreal可滚动内容的总高度
boundsBehaviorenum边界回弹策略(DragAndOvershootBounds/StopAtBounds)
clipbool内容裁剪开关

Flipable核心特性

特性名称作用描述
front属性定义正面显示的QML组件
back属性定义背面显示的QML组件
transform属性实现3D变换的效果组合

示例解析

示例1:可滑动列表(FlickableDemo)

Flickable
Column布局
Repeater
20个矩形项
垂直滚动条
import QtQuick
import QtQuick.ControlsRectangle {width: 400height: 400Flickable {id: flickanchors.fill: parentcontentWidth: column.widthcontentHeight: column.heightclip: true  // 裁剪超出区域的内容// 边界回弹效果boundsBehavior: Flickable.DragAndOvershootBounds//boundsBehavior: Flickable.StopAtBounds// 内容区域Column {id: columnspacing: 20width: flick.widthRepeater {model: 20Rectangle {width: column.width - 20height: 50color: index % 2 ? "darkCyan" : "cyan"border.color: "gray"Text {anchors.centerIn: parenttext: "项目 " + (index + 1)font.pixelSize: 20}}}}// 滚动条指示器ScrollBar.vertical: ScrollBar {policy: ScrollBar.AsNeeded}}
}

代码说明:

这段代码整体实现了一个具有垂直滚动功能的列表界面,通过 Flickable 实现了触摸或鼠标拖动滚动,以及边界回弹等效果,利用 Repeater 生成了多个带有编号和交替颜色的矩形项,并通过滚动条来辅助用户查看所有内容。

Flickable 容器 :

  • contentWidth 和 contentHeight 分别设置为 column 的宽度和高度,这是因为 Flickable 内部放置了一个 Column 布局,其内容的大小由 Column 决定,这样可以让 Flickable 根据内容的大小来确定可滚动的范围。
  • clip: true 表示裁剪超出 Flickable 边界的内容,防止内容在滚动时显示在 Flickable 的外部区域。
  • boundsBehavior 属性设置为 Flickable.DragAndOvershootBounds,允许用户在滚动时可以拖拽内容超出边界,并在释放后内容会回弹到边界内,而注释掉的 Flickable.StopAtBounds 选项则是会在滚动到边界时直接停止,没有回弹效果。

Repeater 生成内容 :

  • model: 20 —> 它会根据这个数字重复生成 20 个相同的子元素。

运行效果:

请添加图片描述


示例2:可翻转卡片(FlipableCard)

Flipable
front Image
back Image
Rotation变换
状态机
鼠标点击触发
import QtQuickRectangle {width: 400height: 400Flipable {id: flipablewidth: 300height: 300anchors.centerIn: parentproperty bool flipped: falsefront: Image {source: "qrc:/images/card_front.png"anchors.fill: parent}back: Image {source: "qrc:/images/card_back.png"anchors.fill: parent}transform: [Rotation {id: rotationorigin.x: flipable.width/2origin.y: flipable.height/2axis.x: 0; axis.y: 1; axis.z: 0angle: 0}]states: State {name: "back"when: flipable.flippedPropertyChanges { target: rotation; angle: 180 }}transitions: Transition {SequentialAnimation {NumberAnimation {target: rotationproperty: "angle"duration: 1000easing.type: Easing.InOutQuad}ScriptAction {script: console.log("翻转完成")}}}MouseArea {anchors.fill: parentonClicked: flipable.flipped = !flipable.flipped}}
}

代码说明:

这段代码实现了一个翻转动画效果,通过点击卡片可以使其在正面和背面之间翻转切换,在需要展示双面信息(附带切换效果)的界面中非常实用。(卡片资源通过通义千问生成)

Flipable 元素 :

  • property bool flipped: 用于控制卡片是否处于翻转状态,当其值为 true 时,卡片会翻转到背面显示;为 false 时,显示正面。

front 和 back 属性 :

  • front 属性关联了一个 Image 元素,表示卡片的正面;而back 属性关联了卡片的背面。

transform 属性 :

  • 定义了一个 Rotation 对象,用于控制卡片的翻转动画。
  • origin.x 和 origin.y 分别设置为 flipable.width/2 和 flipable.height/2,表示旋转的原点是 Flipable 元素的中心点。
  • axis.x: 0; axis.y: 1; axis.z: 0 表示旋转轴为 Y 轴,这样卡片会沿着垂直方向进行翻转,类似于常见的卡片翻转效果。

states 属性 :

  • 定义了一个状态对象,用于描述卡片翻转后的状态。
  • when: flipable.flipped 指定当 Flipable 元素的 “flipped” 属性为 true 时,进入这个状态。
  • PropertyChanges 元素用于在状态切换时改变 Rotation 对象的 “angle” 属性值,将其设置为 180 度,从而实现卡片的翻转效果,使背面朝上。

transitions 属性 :

  • 定义了一个过渡动画对象,用于控制卡片在状态切换时的动画效果。
  • NumberAnimation 用于改变 Rotation 对象的 “angle” 属性值,从而实现翻转动画。

运行效果:
请添加图片描述


总结

第一个示例是一个基于 Qt Quick 的滚动列表实现,利用 Flickable 创建可滚动区域,内部通过 Repeater 动态生成多个带有编号和交替颜色的矩形项,并添加垂直滚动条,实现内容超出时的滚动查看功能。

第二个示例是基于 Qt Quick 的卡片翻转效果实现,使用 Flipable 元素结合状态和过渡动画,在用户点击时通过改变状态触发 3D 翻转动画,实现卡片正反面切换,展示不同的图片内容。

下载链接

下载链接:GitCode -> Flickable & Flipable Demo

在这里插入图片描述


http://www.hkcw.cn/article/HBNaFxnNkS.shtml

相关文章

氮气吹扫电磁阀

一、氮气吹扫电磁阀的概述 氮气吹扫电磁阀是一种重要的工业自动控制设备,用于对工业设备中出现的杂质和沉淀物进行清理,以保证生产线的畅通和生产效率的稳定。其作用是在需要吹扫清洗的工业设备中,通过控制气源的气压,打开电磁阀…

【香港科大+华为诺亚方舟】Web Reconstruction方法:从原始网页文档合成高质量指令遵循数据,效果显著,代码开源

论文名称:Instruction-Tuning Data Synthesis from Scratch via Web Reconstruction 论文链接:https://arxiv.org/abs/2504.15573 机构:香港科技大学 华为诺亚方舟实验室 Github代码链接:https://github.com/YJiangcm/WebR 个人文…

星际巡航-第16届蓝桥第6次STEMA测评Scratch真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥真题,这是Scratch蓝桥真题解析第233讲。 第16届蓝桥第6次STEMA测评已于2025年4月13日落下帷幕,编程题一共有5题(初级组只有前4道编…

C++17新特性 类型推导

在传统C和C中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤 其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖 慢我们的开发效率,也让代…

leetcode 2359. 找到离给定两个节点最近的节点

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,每个节点 至多 有一条出边。 有向图用大小为 n 下标从 0 开始的数组 edges 表示,表示节点 i 有一条有向边指向 edges[i] 。如果节点 i 没有出边,那么 edges[i] -1 。 同时…

Qt creator 设计页面控件认识与了解

记录一下 Qt 中的认识与了解: 在 Qt 中,这些功能属于 Qt Designer 的组件过滤系统,旨在帮助开发者在对象浏览器中快速定位和使用不同类型的控件和组件。以下是每个功能的详细讲解: ‌Layouts(布局)‌&…

[网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)

文章目录 约定前后端交互接口建立连接建立连接响应针对"落子"的请求和响应 客户端开发实现棋盘/棋子绘制部分逻辑解释 约定前后端交互接口 对战模块和匹配模块使用的是两套逻辑,使用不同的 websocket 的路径进行处理,做到更好的耦合 建立连接 …

Redisson学习专栏(三):高级特性与实战(Spring/Spring Boot 集成,响应式编程,分布式服务,性能优化)

文章目录 前言一、Spring Boot深度整合实战1.1 分布式缓存管理1.2 声明式缓存1.3 响应式编程 二、分布式服务治理2.1 服务端实现2.2 客户端调用2.3 高级特性2.4 服务治理功能 三、分布式任务调度引擎四、连接池配置与网络参数调优4.1 连接池配置4.2 网络参数调优4.3 集群模式特…

行程规划:智能规划,轻松旅行

在旅行中,一个好的行程规划是成功旅行的关键。它不仅能帮助你合理安排时间,还能让你的旅行更加经济、高效。成都为普云科技有限公司推出的“行程规划”APP,就是这样一个贴心的旅行助手。它不仅能让你自由记录旅游路线,还能实时记账…

动态报表筛选多项时的优化处理

如图所示 在有比较麻烦且数量比较的动态筛选条件时,就可以单独用一个页面,来囊括所有的参数选项,依次把从接口那得到的筛选列表按id来成数组,依次判断返回赋即可,非常方便

PSpice软件快速入门系列--07.如何进行Worst Case最坏情况分析

背景介绍:由于电路特性受电路中不同元器件的影响程度不同,当电路中不同元器件分别变化时,即使元器件值的变化相同,但电路特性变化的绝对值不会相同,而且其变化的方向也可能不同。PSpice提供了最坏情况分析,…

从收货到上架,海外仓系统如何智能优化入库管理?

在全球电商交易蓬勃发展的当下,跨境电商市场规模持续扩大,海外仓的重要性愈发凸显。其中高效、精准的入库管理,不仅是提升海外仓运营效率的关键,更是赢得客户信任、增强市场竞争力的核心要素。然而,传统的入库模式往往…

特朗普称美国汽车制造商“必须在国内生产整车”

当地时间5月30日,美国总统特朗普表示,包括特斯拉在内的美国汽车制造商必须在美国生产整车和所有零部件,而不是在国外生产。特朗普表示,之前汽车制造商在加拿大、墨西哥、欧洲生产零部件,这让他很困扰,但在接下来的一年里,这些汽车制造商“必须在美国生产整车”。(总台记…

特朗普称6月4日起把进口钢铁关税提高至50%

当地时间5月30日,美国总统特朗普在宾夕法尼亚州举行的一场集会上表示,将把进口钢铁的关税从25%提高至50%。随后,特朗普在社交媒体平台上发文表示,该决定从自6月4日起生效。美国白宫当天在社交媒体上发布公告称,“为进一步保护美国钢铁行业免受外国和不公平竞争的影响,从下…

官方通报:跳至兵马俑三号坑男子已被控制

造成两尊铠甲武士俑损坏 官方通报跳至兵马俑三号坑男子已被控制陕西省西安市公安局临潼分局今日发布警情通报,跳至兵马俑三号坑男子已被公安机关控制。2025年5月30日17时30分许,孙某(男,30岁)进入兵马俑景区参观时,翻越遗址坑护栏及防护网跳至三号坑内推拉陶俑,造成两尊…

【速通RAG实战:进阶】21、取长补短:LangChain与LlamaIndex等RAG框架的企业级融合实践

一、RAG框架的现状与核心挑战 (一)主流框架的优势与局限 LangChain、LlamaIndex等RAG框架已成为构建智能问答系统的基础设施,但在企业级落地中暴露出以下矛盾: 灵活性与专业性的冲突:LangChain的模块化设计支持复杂工作流,但对垂直领域(如医疗、金融)的深度优化不足;…

宝塔部署 Vue + NestJS 全栈项目

这里写自定义目录标题 前言一、Node.js版本管理器1、安装2、配置 二、NestJS项目管理(等同Node项目)1、Git安装2、拉取项目代码3、无法自动认证4、添加Node项目5、配置防火墙(两道) 三、Vue项目管理1、项目上传2、Nginx安装3、配置…

MES系统:助力企业数字化转型

MES管理系统是一个高效、灵活的生产管理系统,能够帮助企业提高生产效率和产品质量,从而获得更大的商业价值。如果你是一家制造企业,那么MES管理系统是你不能错过的重要工具。 一、MES系统核心功能大揭秘: 1、计划管理&#xff1a…

当客服遇见大模型:知识管理智能化转型

数字化转型浪潮下,客服中心作为企业服务前沿阵地,正经历一场深刻变革。面对日益多元、个性化的客户需求,传统依赖人工维护的知识管理体系已难以为继。AI大模型的崛起,为客服中心开辟了新赛道——这不仅是技术迭代,更是…

[NOIP 2001 普及组] 求先序排列 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String infixOrder sc.nextLine(); // 中序String postOrder sc.nextLine(); // 后序sc.close();System.out.println(preOrder(infixOrder, postOrder))…