Spec-Zone.ru › Qt

Расположение с помощью якорей

В дополнение к более традиционным Grid, Row и Column, Qt Quick также предоставляет способ компоновки элементов с использованием концепции якорей. Каждый элемент можно представить как имеющий набор из 7 невидимых «линий якорей»: left, horizontalCenter, right, top, verticalCenter, baseline и bottom.

Линия основания (не представленная выше) соответствует воображаемой линии, на которой располагается текст. Для элементов без текста она совпадает с линией top.

Система якорей Qt Quick позволяет определять отношения между линиями якорей разных элементов. Например, можно написать:

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; ... }

В этом случае левый край rect2 привязан к правому краю rect1, что приводит к следующему:

Можно указать несколько якорей. Например:

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }

Указав несколько горизонтальных или вертикальных якорей, можно управлять размером элемента. Ниже rect2 привязан к правому краю rect1 и левому краю rect3. Если любой из синих прямоугольников будет перемещен, rect2 будет растягиваться и сжиматься по мере необходимости:

Rectangle { id: rect1; x: 0; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
Rectangle { id: rect3; x: 150; ... }

Также существуют некоторые удобные якоря. anchors.fill — это удобная функция, которая эквивалентна установке якорей left, right, top и bottom к соответствующим якорям целевого элемента. anchors.centerIn — еще один удобный якорь, эквивалентный установке якорей verticalCenter и horizontalCenter к соответствующим якорям целевого элемента.

Поля и смещения якорей

Система якорей также позволяет задавать поля и смещения для якорей элемента. Поля определяют количество свободного места, которое необходимо оставить по внешним сторонам якоря элемента, а смещения позволяют изменять позиционирование с использованием центральных линий якорей. Элемент может задавать поля якорей индивидуально через leftMargin, rightMargin, topMargin и bottomMargin или использовать anchors.margins для задания одинакового значения поля для всех четырёх сторон. Смещения якорей задаются с помощью horizontalCenterOffset, verticalCenterOffset и baselineOffset.

Следующий пример задаёт левое поле:

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }

В этом случае отступу в 5 пикселей выделяется слева от rect2, что приводит к следующему:

Примечание: Поля якорей применяются только к якорям; они не являются универсальным способом применения полей к элементу Item. Если поле якоря задано для края, но элемент не привязан к элементу на этом краю, поле не применяется.

Изменение якорей

Qt Quick предоставляет тип AnchorChanges для задания якорей в состоянии.

State {
    name: "anchorRight"
    AnchorChanges {
        target: rect2
        anchors.right: parent.right
        anchors.left: undefined  //remove the left anchor
    }
}

AnchorChanges можно анимировать, используя тип AnchorAnimation.

Transition {
    AnchorAnimation {}  //animates any AnchorChanges in the corresponding state change
}

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

//bad code
Rectangle {
    width: 50
    anchors.left: parent.left

    function reanchorToRight() {
        anchors.right = parent.right
        anchors.left = undefined
    }
}

Когда reanchorToRight вызывается, функция сначала устанавливает правый якорь. В этот момент устанавливаются как левый, так и правый якоря, и элемент будет растянут по горизонтали, чтобы заполнить свой родительский элемент. При снятии левого якоря новая ширина останется неизменной. Таким образом, при обновлении якорей в JavaScript, вы должны сначала снять любые больше не требуемые якоря, а затем установить любые новые необходимые якоря, как показано ниже:

Rectangle {
    width: 50
    anchors.left: parent.left

    function reanchorToRight() {
        anchors.left = undefined
        anchors.right = parent.right
    }
}

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

//bad code
Rectangle {
    width: 50; height: 50
    anchors.left: state == "right" ? undefined : parent.left;
    anchors.right: state == "right" ? parent.right : undefined;
}

Это следует переписать, используя AnchorChanges вместо этого, так как AnchorChanges автоматически будут обрабатывать проблемы с упорядочением внутри.

Ограничения

По соображениям производительности, элемент можно привязать только к своим соседям и непосредственному родителю. Например, следующий якорь недействителен и вызовет предупреждение:

//bad code
Item {
    id: group1
    Rectangle { id: rect1; ... }
}
Item {
    id: group2
    Rectangle { id: rect2; anchors.left: rect1.right; ... }    // invalid anchor!
}

Также компоновка, основанная на якорях, не может быть смешана с абсолютным позиционированием. Если элемент задаёт своё положение x и также устанавливает anchors.left, или привязывает свои левые и правые края, но дополнительно задаёт width, результат неопределён, так как не будет ясно, должен ли элемент использовать привязку или абсолютное позиционирование. То же самое можно сказать о задании положения элемента y и height с anchors.top и anchors.bottom, или установкой anchors.fill наряду с width или height. То же самое относится и к позиционерам, таким как Row и Grid, которые могут устанавливать свойства x и y элемента. Если необходимо переключиться с привязки на абсолютное позиционирование, можно очистить значение якоря, установив его в undefined.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtquick-positioning-anchors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API