Как избежать петли привязки при настройке заполнения?

0

Вопрос

Я хочу обновить заполнение представления прокрутки, если видна полоса прокрутки, но, с другой стороны, видимость полосы прокрутки зависит от высоты/ширины содержимого внутри полосы прокрутки, которая изменяется при изменении заполнения. Следующее вызывает цикл привязки:

ScrollView {
  id: control
  rightPadding: Scrollbar.vertical.visible ? Scrollbar.vertical.width : 0
   ....


  ScrollBar.vertical: ScrollBar {
    parent: control
    visible: control.height < height
   ...
  }
}

Как я могу добиться этого без цикла привязки? Спасибо

qml qt qtquickcontrols2
2021-11-15 14:43:32
1

Лучший ответ

0

Мне не удалось заставить ваш фрагмент кода работать - похоже, ваш код должен зависеть от содержимого вашего ScrollView, но это не включено в ваш фрагмент кода, и в нем могут отсутствовать некоторые другие ссылки.

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

import QtQuick 2.15
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12

ApplicationWindow {
    id: root
    visible: true
    height: 500
    width: 500

    ColumnLayout {
        anchors {
            fill: parent
        }

        Slider {
            // use slider to add delegates to the ScrollView to toggle the scroll bar visibility
            id: slider
            to: 20
        }

        ScrollView {
            id: scroll
            Layout.fillHeight: true
            Layout.fillWidth: true
            ScrollBar.vertical.policy: scrollBarVisible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff

            property bool scrollBarVisible: scroll.contentHeight > scroll.height

            ColumnLayout {
                width: scroll.scrollBarVisible ? scroll.width - scroll.ScrollBar.vertical.width : scroll.width // change the width of the 

                Repeater {
                    model: slider.value
                    delegate: Rectangle {
                        color: "tomato"
                        Layout.fillWidth: true
                        Layout.preferredHeight: 150
                    }
                }
            }
        }
    }
}

Однако следует отметить одну вещь - ваш ScrollView содержимое не может иметь высоту, зависящую от его ширины, например, если содержимое имело некоторые Text это оборачивается, если недостаточно ширины, в результате чего он становится выше, когда ширина уменьшается. Это вернулось бы на территорию бесконечного цикла.

2021-11-16 04:25:42

Спасибо за ваш комментарий. Это именно то, что у меня есть для контента - область текста с переносом слов, где высота зависит от ширины. Есть ли способ избежать рекурсии в этом случае?
Denis

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................