LINUX.ORG.RU

Как в QML нарисовать прямоугольник на весь экран из любого уровня вложенности?

 , , ,


0

1

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

Однако может встать задача спозиционировать элемент относительно экрана на любом уровне вложенности.

Например, если сделан элемент «Небольшое окно уведомления с кнопкой OK», который используется в разных частях программы, то он должен иметь возможность сделать прямоугольную область MouseArea на весь экран. Эта область должна располагаться под элементами данного окна, чтобы не давать нажимать на другие элементы интерфейса программы, которые находятся за данным окном. Ну, то есть, поведение как у модального окна.

Выглядит это примерно так:

Item {
    id: root

    width: sizeMetric*0.4
    height: sizeMetric*0.5

    // Область клика мышкой на весь экран чтобы невозможно было кликнуть под элементами сообщения
    Rectangle {
        id: fullScreenRectangle

        width: mainWindow.width
        height: mainWindow.height

        anchors: - как?

        color: "#80101010"

        MouseArea {
            id: fullScreenMouseArea

            anchors.fill: parent

            onClicked: {
                console.log("Disable click under message");
            }
        }
    }

    // Элементы окна
    Rectangle {
        id: windowInterface

        anchors.fill: parent
        ...
    }
}

Элемент fullScreenRectangle можно позиционировать только относительно root или windowInterface. Но элемент root не имеет информации о своем настоящем положении на экране, во всяком случае я не знаю как эту информацию получить.

Если сделать так:
Rectangle {
        id: fullScreenRectangle

        width: mainWindow.width
        height: mainWindow.height

        x: 0
        y: 0
        ... 
}

То прямоугольник будет отрисован не относительно 0,0 экрана, а относительно 0,0 элемента root.

В общем, вопрос в том, как можно в QML позиционироваться относительно экрана.

★★★★★

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

Если у тебя несколько равнозначных окон одновременно и в одном из них должен быть модальный элемент, то у тебя только вариант городить свой костыль - делать пропертю myModalBehavior в main.qml и в каждом окошке выставлять

enable: !myModalBehavior

А из твоего локального диалога надо будет выставлять что-то вроде

onVisibleChanged: mainId.myModalBehavior = visible

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

В Popup можешь выставить parent: myCurrentWindowId, как вариант. Да, посмотри в сторону parent, может тебе больше и не надо. Ты можешь вставлять в корневой итем любые элементы из дочерних.

ncuxer ()