QML ScrollBar в сочетании с ListView - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в QML и QT, поэтому не вините меня, если этот вопрос покажется глупым для большинства из вас, но я искал по всему inte rnet без какой-либо удачи в поиске ответа.


Что я пытаюсь сделать:

У меня ScrollView, внутри которого ScrollBar и ListView .

Я хочу, чтобы в тот момент, когда я прокручивал элементы ListView, я также перемещал полосу из ScrollBar. Другими словами, я хочу использовать ScrollBar как общий вид вашей текущей позиции, вы не должны его трогать, его единственная цель - просмотр.


Мой код :

   ScrollView{
        implicitHeight: 100
        implicitWidth: 50
        anchors.fill: parent
        ScrollBar.horizontal: ScrollBar{
            id: hbar
            active: true
            policy: ScrollBar.AlwaysOn
            anchors {
                    left: parent.left
                    top: parent.top
                    right: parent.right
            }

            background: Rectangle {
                implicitWidth: 100
                implicitHeight: 50
                opacity: enabled ? 1 : 0.3
                color: hbar.down ? "#red" : "black"
            }
            contentItem: Rectangle {
                implicitWidth: 6
                implicitHeight: 100
                radius: width / 2
                color: hbar.pressed ? "#81e889" : "#c2f4c6"
            }

        }
        ListView {
            id: listViewParent
            height: listViewID.height/10*6

            contentHeight: height*2
            contentWidth: width*2

            clip: false
            interactive: false
            keyNavigationWraps: true
            anchors.right: parent.right
            anchors.rightMargin: 0
            anchors.left: parent.left
            anchors.leftMargin: 0
            enabled: true
            scale: 1
            transformOrigin: Item.Center
            anchors.verticalCenter: parent.verticalCenter
            boundsBehavior: Flickable.DragAndOvershootBounds
            flickableDirection: Flickable.HorizontalFlick
            highlightMoveDuration: 0
            cacheBuffer: 300
            snapMode: ListView.SnapToItem
            layoutDirection: Qt.LeftToRight
            orientation: ListView.Vertical
            model: 1

            delegate:
                ListView {

                width: parent.width;
                height: parent.height;
                spacing: listViewID.width/8/9
                model: MovieListModel {}
                orientation: ListView.Horizontal
                id: listid
                delegate:
                    Rectangle {
                    property int recDynamicHeight: listViewID.height/10*6
                    property int recOriginalHeight: listViewID.height/10*6
                    property int recDynamiclWidth: listViewID.width/7
                    property int recOriginalWidth: listViewID.width/7
                    id: rectPer
                    width: recDynamiclWidth
                    height: recDynamicHeight

                    Image {
                        id: image1
                        anchors.fill: parent;
                        source: model.imgUrl
                    }
                    Text {
                        property bool isVisible: false
                        color: "#ffffff"
                        anchors.fill: parent
                        visible: textid.isVisible
                        id: textid
                        text: model.title
                        font.bold: true
                        horizontalAlignment: Text.AlignLeft
                        font.pixelSize: listViewID.width/8/9
                        topPadding: listViewID.width/8/9
                        leftPadding: listViewID.width/8/9
                    }
                    Text {
                        anchors.topMargin: listViewID.width/8/9
                        color: "#ffffff"
                        anchors.fill: parent
                        visible: textid.isVisible
                        id: yearId
                        text: model.year
                        horizontalAlignment: Text.AlignLeft
                        font.pixelSize: listViewID.width/8/9
                        topPadding: listViewID.width/8/9*2
                        leftPadding: listViewID.width/8/9
                    }

                    MouseArea {
                        anchors.fill: parent
                        onPressed: {
                            rectPer.recDynamicHeight = rectPer.recOriginalHeight;
                            rectPer.recDynamicHeight += rectPer.recOriginalHeight/10;
                            rectPer.recDynamiclWidth += rectPer.recOriginalWidth/10;
                            console.log(textid.isVisible);
                            textid.isVisible = true;
                            textid.visible = textid.isVisible;
                            console.log(sideButtonID.x);
                            console.log(sideButtonID.y);
                            console.log(model.year + " clicked");
                        }
                        onClicked: {
                            console.log("INDEX: " + model.id)
                            load_page(PageType.movie_detailed_view, model.title, model.description, model.imgUrl, model.type, model.year)
                        }
                        onReleased: {
                            rectPer.recDynamicHeight = rectPer.recOriginalHeight;
                            rectPer.recDynamiclWidth = rectPer.recOriginalWidth;
                            textid.isVisible = false;
                            textid.visible = textid.isVisible;
                        }
                    }
                }
            }
        }
    }

Макет:

enter image description here


Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Вы можете попробовать использовать Flickable вместо ScrollView и создать там ListView (делегаты: прямоугольники). Затем создайте Scrollbar внутри ListView

0 голосов
/ 08 апреля 2020

Вы можете попробовать этот код:

ScrollView {
    ScrollBar.horizontal.interactive: false
    //...
}

Вы должны посмотреть на этой странице

...