2017-08-29 89 views
0

我需要使用單個滾動條一次滾動兩個或多個列表視圖。最初,我在Flickable裏面使用了Column,但是滾動沒有像預期的那樣發生。後來,我用ListView,甚至沒有正確滾動。在QML中滾動兩個或多個列表視圖

那麼如何使用滾動條滾動列表視圖/佈局內容項?我應該使用ScrollViewFlickable還是別的?

Example of My UI

+1

'Column' +'Flickable'是如何不按預期滾動的? – GrecKo

+0

考慮有三列,其中col1有10個項目,col2有15個項目,col3有20個項目。現在我應該找到一個列數最多的項目,並且應該將'Flickable contentHeight'設置爲相同,然後才能正常工作! 。在我的情況下,每當所有項目動態插入列時,我都應該這樣做。 – pra7

回答

2

您可以使用FlickableColumns。 我不知道你的Columns是如何水平排列,但如果他們是裏面它是非常簡單的:

import QtQuick 2.7 
import QtQuick.Controls 2.0 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Multi Column") 

    Flickable { 
     anchors.fill: parent 
     contentWidth: row.implicitWidth 
     contentHeight: row.implicitHeight 
     Row { 
      id: row 
      Column { 
       spacing: 5 
       Repeater { 
        model: 20 
        delegate: Rectangle { 
         width: 50 
         height: 50 
         color: "red" 
         Text { 
          anchors.centerIn: parent 
          text: index 
         } 
        } 
       } 
      } 
      Column { 
       spacing: 5 
       Repeater { 
        model: 30 
        delegate: Rectangle { 
         width: 50 
         height: 50 
         color: "cyan" 
         Text { 
          anchors.centerIn: parent 
          text: index 
         } 
        } 
       } 
      } 
     } 
     ScrollBar.vertical: ScrollBar { } 
    } 
} 

即使他們不是在一個你可以這樣做:
contentHeight: Math.max(column1.height, column2.height, ...)

示範:
Multi columns scroll

+0

不知道如何分類滾動*兩個或更多的意見*。但是,也許OP沒有恰當的措辭來說明理想的結果。也許所有的OP都需要一種方法來正確調整內容高度來動態更改列。 – dtech

+0

鑑於OP對我對這個問題的評論的回答,我會說這就是所有OP的需求。 – GrecKo

+0

感謝您的解決方案..這就是我所需要的。不介意「OP」是什麼意思? – pra7

3

股票滾動條將只鉤到一個滾動的項目。然而,這是微不足道的做一個自定義的滾動和鉤到它的多個觀點:

Row { 
    Flickable { 
     width: 50 
     height: main.height 
     contentHeight: contentItem.childrenRect.height 
     interactive: false 
     contentY: (contentHeight - height) * scroller.position 
     Column { 
     spacing: 5 
     Repeater { 
      model: 20 
      delegate: Rectangle { 
      width: 50 
      height: 50 
      color: "red" 
      Text { 
       anchors.centerIn: parent 
       text: index 
      } 
      } 
     } 
     } 
    } 
    Flickable { 
     width: 50 
     height: main.height 
     contentHeight: contentItem.childrenRect.height 
     interactive: false 
     contentY: (contentHeight - height) * scroller.position 
     Column { 
     spacing: 5 
     Repeater { 
      model: 30 
      delegate: Rectangle { 
      width: 50 
      height: 50 
      color: "cyan" 
      Text { 
       anchors.centerIn: parent 
       text: index 
      } 
      } 
     } 
     } 
    } 
    Rectangle { 
     id: scroller 
     width: 50 
     height: 50 
     color: "grey" 
     property real position: y/(main.height - 50) 
     MouseArea { 
     anchors.fill: parent 
     drag.target: parent 
     drag.minimumY: 0 
     drag.maximumY: main.height - 50 
     drag.axis: Drag.YAxis 
     } 
    } 
    } 

注意,它會工作充分,即使意見不同內容的高度,每個視圖相對於滾輪位置滾動:

enter image description here

意識到這個問題並沒有把那好,以防萬一有人想在同一時間以實際滾動多個視圖來臨時,我會仍然有着相似的滾輪另一個有趣的方法,一些可以在每個方向無限期地走,而不是有一個限制像滾動條一樣的範圍。此解決方案將同步滾動兩個視圖,直到它們達到其範圍的範圍。不同於GrecKo的答案,這永遠不會給你留下一個「空觀點」當視圖大小是不同的:

enter image description here

Row { 
    Flickable { 
     id: f1 
     width: 50 
     height: main.height 
     contentHeight: contentItem.childrenRect.height 
     interactive: false 
     Connections { 
     target: jogger 
     onScroll: f1.contentY = Math.max(0, Math.min(f1.contentHeight - f1.height, f1.contentY + p)) 
     } 
     Column { 
     spacing: 5 
     Repeater { 
      model: 20 
      delegate: Rectangle { 
      width: 50 
      height: 50 
      color: "red" 
      Text { 
       anchors.centerIn: parent 
       text: index 
      } 
      } 
     } 
     } 
    } 
    Flickable { 
     id: f2 
     width: 50 
     height: main.height 
     contentHeight: contentItem.childrenRect.height 
     interactive: false 
     Connections { 
     target: jogger 
     onScroll: f2.contentY = Math.max(0, Math.min(f2.contentHeight - f2.height, f2.contentY + p)) 
     } 
     Column { 
     spacing: 5 
     Repeater { 
      model: 30 
      delegate: Rectangle { 
      width: 50 
      height: 50 
      color: "cyan" 
      Text { 
       anchors.centerIn: parent 
       text: index 
      } 
      } 
     } 
     } 
    } 
    MouseArea { 
     id: jogger 
     width: 50 
     height: main.height 
     drag.target: knob 
     drag.minimumY: 0 
     drag.maximumY: main.height - 50 
     drag.axis: Drag.YAxis 
     signal scroll(real p) 
     property real dy: 0 
     onPressed: dy = mouseY 
     onPositionChanged: { 
     scroll(dy - mouseY) 
     dy = mouseY 
     } 
     onScroll: console.log(p) 
     Rectangle { 
     anchors.fill: parent 
     color: "lightgrey" 
     } 
     Rectangle { 
     id: knob 
     visible: parent.pressed 
     width: 50 
     height: 50 
     color: "grey" 
     y: Math.max(0, Math.min(parent.mouseY - 25, parent.height - height)) 
     } 
    } 
    } 

另一個優點的「慢跑」的方式有它難道不是相對的,但絕對的。這意味着如果您的視圖非常龐大,如果您使用滾動條即使是單個像素可能會導致內容發生大轉變,而以絕對模式工作的慢跑將始終滾動相同數量的像素,而不管內容大小如何方便的地方需要精確度。

+0

這是令人不安的觀看:) – GrecKo

+0

@GrecKo - 因爲他們抵消?如果內容高度不同,並且您希望統一滾動瀏覽多個視圖的全部內容,則這是不可避免的。 – dtech

+0

事實上,在這種情況下這是不可避免的,但我不確定OP希望統一滾動。無論如何,我已經做了另一個沒有統一滾動的替代答案。 – GrecKo

相關問題