LINUX.ORG.RU

Как обойти ошибку «QML Flickable: Binding loop detected for property „contentHeight“ ?

 ,


0

1

Делаю настроечное меню для приложения. Оно у меня длинное, длинее высоты экрана, поэтому помещаю его в элемент Flickable. Меню представляет собой Column, которая набирается из Item:

Flickable {
    id: flickable

    width: Screen.width
    height: Screen.height
    boundsBehavior: Flickable.DragAndOvershootBounds
    flickableDirection: Flickable.VerticalFlick

    contentHeight: menuList.height

    Column {
        id: menuList
        spacing: 5

        anchors.fill: parent

        Item {
            id: rowLanguageSettings
            height: Screen.height / 8
            anchors.right: parent.right
            anchors.left: parent.left

            Label {
                id: languageLabel
                text: qsTr("Language1")
                anchors.left: parent.left
                anchors.verticalCenter: parent.verticalCenter
                horizontalAlignment: Text.AlignLeft
                verticalAlignment: Text.AlignVCenter
            }

            ComboBox {
                id: languageSelectComboBox
                anchors.leftMargin: parent.width * 0.64
                anchors.left: parent.left
                anchors.right: parent.right
                anchors.verticalCenter: parent.verticalCenter
                model: ["Eng", "Rus"]
            }
        }

        Item {
            id: rowSpeedSettings
            height: Screen.height / 8
            ...        
        }

Для того, чтобы работала вертикальная прокрутка, необходимо указать contentHeight. Если его указать просто числом, с запасом, например 3000, то прокрутка работает.

Но ведь надо указывать настоящий размер меню, поэтому я пишу:
contentHeight: menuList.height

и получаю ошибку:
QML Flickable: Binding loop detected for property "contentHeight"

Но никакого зацикливания в коде нет. Никаких других установок высоты, кроме тех что показаны в коде выше, ни в элементах ни в подэлементах нет. (Можно убрать id у Item и понакопировать штук 10 их).

Но из-за этой ошибки не работает прокрутка. Меню все время стремится к верхней точке, и низа увидеть невозможно.

Я навесил отладочное сообщение на изменение
        onContentHeightChanged: {
            console.log("ContentHeight: "+contentHeight);
        }

И оно показало, что вычислимое значение равняется 440. Хотя высота меню явно около 2500.

Вот. Как можно исправить такую ситуацию?

★★★★★

очевидно, ты вложенность попутал. qt автоматом забиндило вложенный контрол к родительскому. а ты вдогонку указал обратную связь, вот и цикл.

Anoxemian ★★★★★
()

Но никакого зацикливания в коде нет.

anchors.fill: parent

вот зацикливание

tnodir
()

Так, походу разобрался.

Я долго ковырялся, и нащупал, что надо ставить

anchors.fill: parent

иначе без него все строки Column сливались в одну.

Но ведь для этой привязки parent является contentItem элемента Flickable, и видимо в этом проблема.

Оказывается, вместо такой привязки можно привязаться только по ширине, и тогда почему-то по высоте строки Column перестают сливаться в одну. То есть, заменил эту строку на
anchors.right: parent.right
anchors.left: parent.left

И прокрутка заработала.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.