LINUX.ORG.RU

Как в QML организовать приложение с портретной и ландшафтной ориентацией?

 , , ,


0

3

Пытаюсь сделать приложение, которое состоит из двух крупных объединений экранных элементов, назовем их условно 1 и 2.

В ландшафтном режиме они располагаются слева-направо, в портретном режиме должны располагаться сверху-вниз, вот как на картинке:

Компоновка экранных элементов

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

Вопрос такой: как сделать (каким механизмом воспользоваться) чтобы программно изменять компоновку экрана с ландшафтной на портретную и обратно?

Причем надо, чтобы менялся сам экран, то есть был размером 1920x1080, а стал 1080х1920. А объединения 1 и 2 меняли бы только свои координаты, и им не требовалось поворота на 90 градусов.

Конечная сборка идет под Андроид, если это важно.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Может воспользоваться какой-нибудь libKF5Screen и менять там ориентацию? Или каким - нибудь xrandr (но через libKF5Screen по идее доожно быть универсальнее, может оно в вяленд умеет).

wolph ★★
()

Причем надо, чтобы менялся сам экран, то есть был размером 1920x1080, а стал 1080х1920.

Надо верстать адаптивно. Никаких захардкоженных значений.

anonymous
()

В Gtk это можно сделать упаковав блоки в контейнер GtkBox и менять c orientation Horizontal в Vertical. Может в Qt есть что-то подобное.

anonymous
()
Ответ на: комментарий от anonymous

Если проблема не в том как аппаратно переключить ориентацию, а в верстке - то можно взять куэмельный SplitView - у него есть поле orientation.

wolph ★★
()
Ответ на: комментарий от wolph

Я может, что-то не до конца объяснил.. Сборка идет под Андроид. Поэтому никаких libKF5Screen, xrandr, GTK и вяленных не предполагается.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

То есть пользователь там в ведроидовской менюшке выберет сам нужную ориентацию? Тогда просто верстать с оглядкой на Screen.orientation. Если же надо ее именно в своем приложении устанавливать - черт знает как это делается, нужно искать что то подобное в ведроидовском sdk и дергать по jni.

wolph ★★
()

SideBySideLayout.qml:

import QtQuick 2.0

Item {
    id: sbs
    property bool landscapeWhen: width >= height
    property real splitOn: 0.5  // 0..1
    property real splitAt: 0  // fixed width/height of 1-st child
    property real spacing: 0

    property Item firstChild: children[1]
    property Item secondChild: children[children.length === 2 ? 0 : 2]

    Binding {
        target: firstChild.anchors
        property: "left"
        value: sbs.left
    }

    Binding {
        target: firstChild.anchors
        property: "top"
        value: sbs.top
    }

    Binding {
        target: secondChild.anchors
        property: "right"
        value: sbs.right
    }

    Binding {
        target: secondChild.anchors
        property: "bottom"
        value: sbs.bottom
    }

    Item {
        id: dummy  // children[0]
    }

    states: [
        State {
            name: "portrait"
            when: !landscapeWhen
            AnchorChanges {
                target: firstChild
                anchors.bottom: undefined
                anchors.right: sbs.right
            }
            PropertyChanges {
                target: firstChild
                width: undefined
                height: (sbs.splitAt || sbs.height * sbs.splitOn)
                        - sbs.spacing / 2
            }
            AnchorChanges {
                target: secondChild
                anchors.top: undefined
                anchors.left: sbs.left
            }
            PropertyChanges {
                target: secondChild
                width: undefined
                height: (sbs.splitAt ? (sbs.height - sbs.splitAt)
                                     : sbs.height * (1.0 - sbs.splitOn))
                        - sbs.spacing / 2
            }
        },
        State {
            name: "landscape"
            when: landscapeWhen
            AnchorChanges {
                target: firstChild
                anchors.bottom: sbs.bottom
                anchors.right: undefined
            }
            PropertyChanges {
                target: firstChild
                width: (sbs.splitAt || sbs.width * sbs.splitOn)
                       - sbs.spacing / 2
                height: undefined
            }
            AnchorChanges {
                target: secondChild
                anchors.top: sbs.top
                anchors.left: undefined
            }
            PropertyChanges {
                target: secondChild
                width: (sbs.splitAt ? (sbs.width - sbs.splitAt)
                                    : sbs.width * (1.0 - sbs.splitOn))
                       - sbs.spacing / 2
                height: undefined
            }
        }
    ]
}
tnodir
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.