Comment éviter la boucle de liaison lors de la configuration de rembourrage?

0

La question

Je veux mettre à jour le rembourrage de une ScrollView si il y a une barre de défilement visible, mais d'un autre côté, la visibilité de la barre de défilement dépend de la hauteur/largeur du contenu à l'intérieur de la barre de défilement, ce qui change lorsque le rembourrage des changements. Les causes suivantes d'une boucle de liaison:

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


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

Comment puis-je obtenir sans une boucle de liaison? Merci

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

La meilleure réponse

0

J'ai été incapable d'obtenir votre code frag de travail - il semble que votre code doit dépendre du contenu de votre ScrollViewmais ce n'est pas inclus dans votre code frag, et il peut manquer quelques autres références.

De toute façon, je suggère de s'approchant de cela un peu différemment - changer le ScrollView's le contenu de la largeur de la base de si oui ou non les ScrollBar est visible. J'ai également réglé le ScrollBar de la politique au lieu de visibilité. J'ai créé un exemple complet d'où vous pouvez ajouter ou supprimer du contenu à l'aide d'un curseur pour la démonstration:

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
                    }
                }
            }
        }
    }
}

Une chose à noter, cependant, votre ScrollView le contenu ne peut pas avoir sa hauteur dépend de sa largeur, par exemple, si le contenu avait quelques Text qui enveloppe si il n'y a pas assez de largeur, à l'origine pour obtenir plus grand lorsque la largeur diminue. Ce serait revenir dans l'infini de la boucle de territoire.

2021-11-16 04:25:42

Merci pour votre commentaire. C'est exactement ce que j'ai pour le contenu d'un textArea avec word wrap, où la hauteur est fonction de la largeur. Est il possible que je peux éviter de récursivité dans ce cas?
Denis

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................