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

Я работаю над проектом Qt, где почти все элементы QML находятся в одном файле main.qml. Приложение использует StackLayout для навигации по другим файлам QML, а также для представления элементов в самом main.qml.

Я использую Loader для вызова компонента, содержащего GridLayout, содержащий метки и изображения. Вне этого контейнера есть другие изображения и метки, привязанные к нижней части mainWindow.

Проблема заключается в том, что при вызове компонента в StackLayout с помощью загрузчика размеры компонента перекрывают изображение, определенное в ApplicationWindow. Он ведет себя как fillHeight для всего окна, чего я не хочу.

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

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

Структура кода аналогична этой,

ApplicationWindow {
    id: mainWindow
    width: 500
    height: 400

    (... some code ...)

    Image{
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.bottomMargin: 22
        anchors.leftMargin: 24
        width: 80
        height: 40
        fillMode: Image.Stretch
        source: "qrc:/image.png"
    }

    StackLayout {
        id: mainStackLayout
        width: mainWindow.width
        height: mainWindow.height

        FirstPage {}  // another .qml file
        Loader {
            sourceComponent: component
        }
    }

    Component{
        id: component

    GridLayout {
        id: grid
        width: mainWindow.width
        height: mainWindow.height
        columns: 4

    Labels{}
    ...
    ...
    ...
    Labels{}
    }

person Anas AG    schedule 20.04.2021    source источник


Ответы (1)


Проблема в первую очередь в том, что вы настроили свой StackLayout так, чтобы он покрывал все окно:

        width: mainWindow.width
        height: mainWindow.height

и StackLayout будет увеличивать свои дочерние элементы, чтобы они соответствовали его размеру.

Два простых варианта:

  1. Поместите свой загрузчик внутрь элемента, чтобы вместо этого элемент рос, а размер вашего загруженного компонента не влиял.
  2. Поместите макет в ApplicationWindow, чтобы ваше изображение и ваш StackLayout лучше управлялись по отношению друг к другу.

Я бы рекомендовал вариант 2. Если вы не собираетесь разрешать пользователям изменять размер вашего окна, все ваши компоненты QML должны иметь возможность изменять размер.

person David K. Hess    schedule 20.04.2021
comment
Окно имеет фиксированный размер, пользователи не могут масштабировать его. Я попробовал первый вариант, просто добавив Item в качестве родителя для Loader, но это не дало никакого эффекта. Я попробовал второй вариант, но он дал те же проблемы, что и первоначальная проблема. По сути, во втором варианте размер и позиционирование изображения ведут себя странно при использовании привязки внутри родительского элемента макета. - person Anas AG; 20.04.2021
comment
В качестве обходного пути я добавил нижнее поле для последнего элемента в компоненте, чтобы действовать как мера безопасности, чтобы избежать его столкновения с другими нижними элементами. Хотя хотелось бы решить ее профессионально. - person Anas AG; 20.04.2021
comment
› Я попробовал первый вариант, просто добавив элемент в качестве родителя для загрузчика, но это не дало никакого эффекта... Обязательно установите правильные поля/размер относительно родителя по мере необходимости. Для второго варианта вы не используете якоря, вы используете прикрепленные свойства макета. - person pooya13; 21.04.2021