Позиционирование элемента относительно других элементов

Последнее обновление: 12.12.2023

Qt Quick позволяет прикрепить один элемент управления к другому элементу. Для этого применяется свойство anchors, которое позволяет установить расположение относительно 7 условных линий и для установки относительно каждой линии предоставляет соответствующее свойство:

  • left: устанавливает расположение относительно левого края элемента

  • right: устанавливает расположение относительно правого края элемента

  • top: устанавливает расположение относительно верхнего края элемента

  • bottom: устанавливает расположение относительно нижнего края элемента

  • baseline: устанавливает расположение относительно базовой линии элемента (по линии текста; если текста нет, то аналогично top)

  • horizontalCenter: устанавливает расположение по горизонтали относительно центра элемента

  • verticalCenter: устанавливает расположение по вертикали относительно центра элемента

Свойство anchors в Qt и QML

Еще одно свойство - centerIn позволяет позиционировать элемент в центре другого элемента. Например, поместим прямоугольник по центру окна:

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle{
        width: 150
        height: 150
        anchors.centerIn: parent    // расположение по центру
        color: "green"
    }
}

Здесь располагаем по центру зеленый квадрат размером 150х150:

Позиционирование элемента по центру в Qt и QML

Для установки по центру применяем вложенное свойство anchors.centerIn

anchors.centerIn: parent

Слово "parent" представляет специальный идентификатор, который указывает на родительский элемент-контейнер. То есть в данном случае в качестве "parent" будет использоваться объект Window.

Аналогично можно расположить элемент относительно определенной стороны элемента. Например, разместим прямоугольник внизу окна:

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle{
        width: 100
        height: 100
        anchors.bottom: parent.bottom   // расположение внизу контейнера
        color: "green"
    }
}
Позиционирование элемента относительно стороны контейнера в Qt и QML

Здесь свойство anchors.bottom устанавливает нижнюю границу элемента. Она получает значение parent.bottom, что указывает, что нижняя граница элемента прижимается к нижней границе контейнера.

Аналогичным образом можно позиционировать элемент по другим сторонам контейнера:

Rectangle{
    width: 100
    height: 100
    anchors.right: parent.right   // у правой границы контейнера
    color: "green"
}

Можно совмещать установку по нескольким сторонам:

Rectangle{
    width: 100
    height: 100
    anchors.bottom: parent.bottom  // у нижней границы контейнера
    anchors.right: parent.right   // у правой границы контейнера
    color: "green"
}

В данном случае прямоугольник размещается по нижней и правой границе контейнера

Позиционирование элемента по сторонам контейнера в Qt и QML

Если для элемента устанавливается несколько вложенных свойств anchors, то их можно сгруппировать:

Rectangle{
    anchors {
        bottom: parent.bottom
        right: parent.right
    }
    width: 100
    height: 100
    color: "green"
}

Установка отступов

QML позволяет также задать отступ от определенной строны контейнера. Для этого применяются следующие свойства:

  • leftMargin

  • rightMargin

  • topMargin

  • bottomMargin

Например, настроем отступы от верхней и левой сторон окна:

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle{
        width: 100
        height: 100
        anchors.left: parent.left  // по левой границе контейнера
        anchors.leftMargin: 20     // отступ слева
        anchors.top: parent.top    // по верхней границе контейнера
        anchors.topMargin: 10      // отступ сверха
        color: "green"
    }
}
Установка отступов элемента от сторон контейнера в Qt и QML

Также можно сократить определение свойств:

Rectangle{
    width: 100
    height: 100
    anchors {
        left: parent.left  // по левой границе контейнера
        leftMargin: 20     // отступ слева
        top: parent.top    // по верхней границе контейнера
        topMargin: 10      // отступ сверха
    }
    color: "green"
}

Позиционируя элемент по всем четырем сторонам контейнера, мы можем разместить его по центру:

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle{
        anchors {
            left: parent.left
            leftMargin: 20
            top: parent.top
            topMargin: 20
            bottom: parent.bottom
            bottomMargin: 20
            right: parent.right
            rightMargin: 20
        }
        color: "green"
    }
}
Размещение элемента по центру контейнера в Qt и QML

Позиционирование относительно других элементов

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

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle{
        id: greenRect
        width: 100
        height: 100
        anchors {
            left: parent.left
            leftMargin: 20
            top: parent.top
            topMargin: 20
        }
        color: "#16a085"    // зеленый цвет
    }

    Rectangle{
        id: redRect
        width: 100
        height: 100
        anchors {
            left: greenRect.right // левая граница по правому краю greenRect
            leftMargin: 20
            top: parent.top
            topMargin: 20
        }
        color: "#eb4d4b"    // красный цвет
    }
}

Здесь у нас два прямоугольника, которые размещены в окне. Чтобы идентифицировать каждый элемент и ссылаться на него в коде QML, у них назначается свойство id. Например, первый (зеленый) прямоугольник имеет идентификатор "greenRect", и через этот идентификатор можно получить данный прямоугольник в других частях кода QML. Так, второй (красный) прямоугольник устанавливает свою левую границу по правой границе прямоугольника greenRect:

anchors {
    left: greenRect.right // левая граница по правому краю greenRect
    leftMargin: 20

Чтобы прямоугольники не сливались, устанавливается отступ в 20 единиц. Таким образом, мы полчим следующее окно:

Позиционирование элемента относительно соседних элементов в Qt и QML
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850