QML用PathView實(shí)現(xiàn)輪播圖
輪播圖是一個(gè)常見的功能,在QML中,可以使用PathView來實(shí)現(xiàn)一個(gè)循環(huán)播放的輪播圖組件。
默認(rèn)情況,如果限制了加載個(gè)數(shù),切換時(shí)第一幀會(huì)馬上消失,第二幀才進(jìn)入,這樣會(huì)有斷檔的感覺。通過設(shè)置PathView中preferredHighlightBegin/End為0.5,這樣當(dāng)前選定的項(xiàng)位于路徑的中間,就沒有斷檔的感覺了。效果如下(為了測(cè)試,我沒有clip,clip之后只有范圍內(nèi)的才可見):
//CircleView.qml
import QtQuick 2.12 import QtQuick.Controls 2.12 //輪播圖 Item { id: control property int indicatorWidth: 12 //定時(shí)切換間隔 property alias timerInterval: path_timer.interval //切換動(dòng)畫執(zhí)行時(shí)間 property alias pathDuration: path_view.highlightMoveDuration property alias delegate: path_view.delegate property alias model: path_view.model //頁(yè)數(shù) property alias count: path_page.count PathView{ id: path_view anchors.fill: parent //此屬性保存任何時(shí)候在路徑上可見的項(xiàng)目數(shù)。 //將pathItemCount設(shè)置為undefined將顯示路徑上的所有項(xiàng)目。 //因?yàn)閜ath代碼的問題,設(shè)置為2最合適 pathItemCount: 2 //測(cè)試時(shí),把clip去掉就能看到完整的 //clip: true //向前移動(dòng),即順序0 1 2 3 movementDirection: PathView.Positive //切換的時(shí)間 highlightMoveDuration: 1000 //視圖中突出顯示(當(dāng)前項(xiàng)目)的首選范圍,默認(rèn)值PathView.StrictlyEnforceRange //配合preferredHighlight的范圍0.5 0.5,就能顯示在正中,切換更自然 //highlightRangeMode: PathView.StrictlyEnforceRange //希望當(dāng)前選定的項(xiàng)位于路徑的中間,則將突出顯示范圍設(shè)置為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(); } } //測(cè)試用 //model: ["red","green","blue"] //delegate: Rectangle{ // width: path_view.width // height: path_view.height // color: modelData //} } //定時(shí)切換 Timer{ id: path_timer running: control.visible repeat: true interval: 3000 onTriggered: { //至少兩個(gè)才切換 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" //非當(dāng)前頁(yè)就灰色 opacity: index===path_page.currentIndex?1:0.6 Behavior on opacity { OpacityAnimator{ duration: 200 } } //點(diǎn)擊跳轉(zhuǎn)到該頁(yè) //還有問題,非連續(xù)的item,他會(huì)快速連續(xù)切換到目標(biāo)index //因?yàn)椴皇侵苯忧袚Q,有閃爍的感覺 MouseArea{ anchors.fill: parent onClicked: { path_view.currentIndex=index; if(path_timer.running){ path_timer.restart(); } } } } } }
//main.qml
測(cè)試了不同的Item個(gè)數(shù)
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" } } } }
借鑒:鏈接
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
將Python中的數(shù)據(jù)存儲(chǔ)到系統(tǒng)本地的簡(jiǎn)單方法
這篇文章主要介紹了將Python中的數(shù)據(jù)存儲(chǔ)到系統(tǒng)本地的簡(jiǎn)單方法,主要使用了pickle模塊,需要的朋友可以參考下2015-04-04詳解Python如何實(shí)現(xiàn)尾遞歸優(yōu)化
尾遞歸是函數(shù)返回最后一個(gè)操作是遞歸調(diào)用,則該函數(shù)是尾遞歸。本文將介紹Python是如何實(shí)現(xiàn)尾遞歸優(yōu)化的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05解決python mysql insert語(yǔ)句的問題
這篇文章主要介紹了解決python mysql insert語(yǔ)句的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python3通過字符串訪問和修改局部變量的方法實(shí)例
最近在看python中nonlocal和global的使用,參考網(wǎng)上的大作,寫了點(diǎn)自己的心得,下面這篇文章主要給大家介紹了關(guān)于Python3通過字符串訪問和修改局部變量的相關(guān)資料,需要的朋友可以參考下2022-04-04python函數(shù)之任意數(shù)量的實(shí)參方式
這篇文章主要介紹了python函數(shù)之任意數(shù)量的實(shí)參方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python數(shù)據(jù)類型可變不可變知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給各位整理的是關(guān)于python數(shù)據(jù)類型可變不可變知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。2020-03-03