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.pswp.cn/pingmian/76497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76497.shtml
英文地址,請注明出處:http://en.pswp.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; …