QML之Flickable(滚动区域)

Flickable 是 QML 中用于创建可滚动区域的基础组件,它比 ScrollView 提供更底层的控制,适合需要自定义滚动行为的场景。

基本用法

qml

import QtQuick 2.15Flickable {width: 200height: 200contentWidth: 400  // 内容总宽度contentHeight: 800 // 内容总高度// 内容项Rectangle {width: 400height: 800gradient: Gradient {GradientStop { position: 0.0; color: "red" }GradientStop { position: 1.0; color: "blue" }}}
}

Flickable 属性表

1. 核心属性
属性类型默认值说明
contentWidthreal0必须设置 - 内容区域的总宽度
contentHeightreal0必须设置 - 内容区域的总高度
contentXreal0当前水平滚动位置(可读写)
contentYreal0当前垂直滚动位置(可读写)
clipboolfalse是否裁剪超出部分(建议设为 true
interactivebooltrue是否允许用户交互滚动
2. 滚动行为控制
属性类型默认值说明
boundsBehaviorenumFlickable.StopAtBounds边界行为:
StopAtBounds - 不能拖出边界
DragOverBounds - 可拖出边界(有回弹)
OvershootBounds - 允许短暂超出
flickableDirectionenumAutoFlickDirection滚动方向:
HorizontalFlick - 仅水平
VerticalFlick - 仅垂直
HorizontalAndVerticalFlick - 双向
AutoFlickDirection - 自动判断
maximumFlickVelocityreal2500最大滚动速度(像素/秒)
flickDecelerationreal1500滚动减速系数(值越大停止越快)
pressDelayint0触摸按下延迟(毫秒)
3. 只读属性
属性类型说明
draggingbool是否正在拖动
flickingbool是否正在惯性滚动
movingbool是否正在移动(拖动或惯性滚动)
visibleAreaobject包含:
widthRatio - 可见宽度比例
heightRatio - 可见高度比例
xPosition - 水平位置(0.0-1.0)
yPosition - 垂直位置(0.0-1.0)
4. 信号
信号参数说明
movementStarted()-开始滚动时触发
movementEnded()-滚动停止时触发
flickStarted()-惯性滚动开始时触发
flickEnded()-惯性滚动结束时触发
contentXChanged()real水平位置变化时触发
contentYChanged()real垂直位置变化时触发
5. 常用方法
方法参数说明
flick(vx, vy)vx: 水平速度
vy: 垂直速度
以指定速度触发惯性滚动
cancelFlick()-立即停止惯性滚动
returnToBounds()-强制回到边界内

完整示例代码

import QtQuick 2.15Flickable {id: flickwidth: 300height: 400contentWidth: contentItem.widthcontentHeight: contentItem.heightclip: trueboundsBehavior: Flickable.DragOverBounds// 内容项Grid {id: contentItemwidth: 600height: 800columns: 3spacing: 10Repeater {model: 50Rectangle {width: 180; height: 180color: Qt.hsla(index/50, 0.8, 0.6, 1)Text { text: index; anchors.centerIn: parent }}}}// 监听滚动onContentYChanged: console.log("Y位置:", contentY)onMovementEnded: console.log("滚动停止")// 滚动到指定位置function scrollToBottom() {contentY = contentHeight - height}
}

 

滚动行为控制

qml

Flickable {// 启用水平和垂直滚动flickableDirection: Flickable.HorizontalAndVerticalFlick// 允许拖动超出边界(会有回弹效果)boundsBehavior: Flickable.DragOverBounds// 滚动速度系数flickDeceleration: 1500// 最大速度限制maximumFlickVelocity: 2500
}

与 ScrollBar 配合使用

qml

import QtQuick 2.15
import QtQuick.Controls 2.15Flickable {id: flickwidth: 200height: 200contentWidth: 400contentHeight: 800// 内容项...// 垂直滚动条ScrollBar.vertical: ScrollBar {policy: ScrollBar.AsNeededsize: flick.height / flick.contentHeightposition: flick.visibleArea.yPosition}// 水平滚动条ScrollBar.horizontal: ScrollBar {policy: ScrollBar.AsNeededsize: flick.width / flick.contentWidthposition: flick.visibleArea.xPosition}
}

可见区域计算

qml

Flickable {// 获取可见区域比例和位置property real visibleWidthRatio: visibleArea.widthRatioproperty real visibleHeightRatio: visibleArea.heightRatioproperty real visibleXPosition: visibleArea.xPositionproperty real visibleYPosition: visibleArea.yPosition
}

高级用法

1. 滚动到指定位置

qml

// 滚动到水平中心
flick.contentX = (flick.contentWidth - flick.width) / 2// 带动画效果
NumberAnimation {target: flickproperty: "contentX"to: targetValueduration: 500easing.type: Easing.InOutQuad
}.start()

2. 嵌套 Flickable

qml

Flickable {// 外部FlickableFlickable {// 内部Flickable// 需要处理事件传递onMovementStarted: parent.flickableDirection = Flickable.HorizontalFlickonMovementEnded: parent.flickableDirection = Flickable.AutoFlickDirection}
}

3. 下拉刷新实现

qml

Flickable {id: flickonMovementEnded: {if (contentY < -refreshThreshold) {// 触发刷新}}Rectangle {// 刷新指示器y: -heightvisible: flick.contentY < 0}
}

性能优化技巧

  1. 启用裁剪

    qml

    Flickable {clip: true
    }
  2. 动态加载内容

    qml

    Flickable {// 只加载可视区域内容Loader {visible: y >= flick.contentY && y <= flick.contentY + flick.height}
    }
  3. 减少过度绘制

    qml

    Flickable {layer.enabled: truelayer.textureSize: Qt.size(width, height)
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NumPy科学计算引擎:从基础操作到高性能实践】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析关键技术模块说明技术选型对比 二、实战演示环境配置核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技巧 五、应用…

PandaGPT实战(1): 环境配置及效果演示

文章目录 1. 环境安装2. 数据准备2.1 模型权重获取2.2 训练数据准备3. 效果演示3.1 训练3.2 部署效果PandaGPT是首个无需显式监督即能跨六种模态执行指令微调任务的基础模型。它展现出多样化的多模态能力,包括复杂理解/推理、基于知识的描述以及多轮对话交互。 作为通用型指令…

spring security oauth2.0 使用GitHub

在 Spring Security 中集成 GitHub 的 OAuth 2.0 登录&#xff0c;可以实现用户通过 GitHub 账号快速认证。以下是完整的分步实现指南和代码示例&#xff1a; 一、前置准备 1. 在 GitHub 注册 OAuth 应用 访问 GitHub Settings → Developer settings → OAuth Apps点击 New …

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …

小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案

问答题: 0. 请问下面代码有没有毛病&#xff0c;为什么? 请问下面代码为什么会出错&#xff0c;应该如何解决&#xff1f; 答:这是由于在字符串中&#xff0c;反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生&#xff0c;我们可以在字符串的引号前面…

Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。

一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要&#xff0c;本地优先且可扩展 。使用开源模型 &#xff08;Whisper & Llama&#xff09; 离线工作&#xff0c;高度可扩展 &#xff0c;由插…

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中&#xff0c;任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类&#xff1a; 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间&#xff08;相对延时&#xff0c;从调用时开始计算&#xff09;。 示例&…

各种“排序”的方法

文章目录 插入排序1. 直接插入排序(O(n^2))举例1&#xff1a;举例2&#xff1a;直插排序的"代码"直插排序的“时间复杂度” 2. 希尔排序(O(n^1.3))方法一方法二(时间复杂度更优) 选择排序堆排序直接选择排序 我们学过冒泡排序&#xff0c;堆排序等等。&#xff08;回…

【Linux网络与网络编程】08.传输层协议 UDP

传输层协议负责将数据从发送端传输到接收端。 一、再谈端口号 端口号标识了一个主机上进行通信的不同的应用程序。在 TCP/IP 协议中&#xff0c;用 "源IP"&#xff0c;"源端口号"&#xff0c;"目的 IP"&#xff0c;"目的端口号"&…

python求π近似值

【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值&#xff0c;利用上述公式计算出π的近似值&#xff0c;然后输出π值&#xff0c;保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…

第十六届蓝桥杯省赛JavaB组题解

A 逃离高塔 第一道填空题很简单&#xff0c;根据题意跑一边循环即可&#xff0c;一共是202个符合条件的数 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int ans0;for(long i0;i<2025;i){if((i*i*i)%103)ans;}System.out.println(ans)…

汽车车窗升降系统全生命周期耐久性验证方案研究

随着汽车行业的快速发展&#xff0c;消费者对于汽车品质和安全性的要求日益提高。汽车车窗升降系统作为汽车电子系统中的重要组成部分&#xff0c;其可靠性和耐久性直接影响到用户的使用体验和行车安全。车窗升降系统在日常使用中频繁操作&#xff0c;承受着各种复杂的工况&…

嵌入式Linux——8 串口

目录 1.终端&#xff08;tty&#xff09; /dev/tty*&#xff1a;物理/虚拟终端 /dev/pts/*&#xff1a;伪终端 /dev/tty&#xff1a;当前进程的控制终端 /dev/tty0&#xff1a;当前活动的虚拟控制台 2.行规程模式&#xff08;line discipline&#xff09; 比较行规程和原…

Docker日志查看与资源监控指令全解:从基础到高阶运维实践

Docker日志查看与资源监控指令全解&#xff1a;从基础到高阶运维实践 一、日志管理&#xff1a;穿透容器内部的眼睛1.1 基础日志操作核心命令&#xff1a;docker logs日志驱动配置 1.2 高级日志处理JSON日志解析多容器日志聚合 二、资源监控&#xff1a;掌握容器生命体征2.1 实…

初学STM32之编码器测速以及测频法的实现

资料来着江协科技 这篇是编码器测速&#xff0c;江科大的源码在测速的时候&#xff0c;定时器TIM2是一直在跑的&#xff0c;不受其它控的&#xff0c;它就一直隔1S读一次CNT的值。它也不管是否有输入信号。源码程序修改一下是可以实现对PWM信号以测频法的方式读取。 笔者稍微改…

oracle怎么查看是否走了索引

SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14384cb24468; 这是查询语句&#xff0c;怎么看这个查询是否走了索引呢 EXPLAIN PLAN FOR SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14…

C++进阶——C++11_{ }初始化_lambda_包装器

目录 1、{ }初始化 1.1 C98的{ } 1.2 C11的{ } 1.3 C11中的std::initializer_list 总结一下&#xff1a; 2、lambda 2.1 lambda的语法 2.2 捕捉列表 2.3 lambda的应用 2.4 lambda的原理 3、包装器 3.1 function 3.2 bind 1、{ }初始化 1.1 C98的{ } C98中一般数组…

【微知】Mellanox网卡网线插入后驱动的几个日志?(Cable plugged;IPv6 ... link becomes ready)

概要 本文是一个简单的信息记录。记录的是当服务器网卡的光模块插入后内核的日志打印。通过这种日志打印&#xff0c;可以在定位分析问题的时候&#xff0c;知道进行过一次模块插拔。 日志 截图版&#xff1a; 文字版&#xff1a; [32704.121294] mlx5_core 0000:01:00.0…

单片机Day05---静态数码管

目录 一、原理图&#xff1a;​编辑 二、思路梳理&#xff1a; 三&#xff1a;一些说明&#xff1a; 1.点亮方式&#xff1a; 2.数组&#xff1a; 3.数字与段码对应&#xff1a; 四&#xff1a;程序实现&#xff1a; 一、原理图&#xff1a; 二、思路梳理&#xff1a; …