Правильный способ реализации масштабирования / масштабирования в Qt Quick (QML) Flickable

Я использую Qt 5.2 beta, Qt Quick 2.1.

у меня есть прямо вперед проблема с Flickable компонент.

вот минимальный пример рабочего кода:

import QtQuick 2.1
import QtQuick.Controls 1.0

ApplicationWindow {
    width: 300
    height: 200

    Rectangle {
        anchors.fill: parent
        color: "green"

        Flickable {
            id: flickArea
            anchors {fill: parent; margins: 10; }
            contentWidth: rect.width;
            contentHeight: rect.height
            Rectangle {
                id: rect
                x: 0; y: 0;
                width: 200; height: 300;
                color: "lightgrey"

                Rectangle {
                    anchors { fill: parent; margins: 10; }
                    color: "red"
                }
            }
        }
    }
    Button {
        anchors.bottom: parent.bottom;
        anchors.horizontalCenter: parent.horizontalCenter;
        text: "Scale flickArea"
        onClicked: { flickArea.scale += 0.2; }
    }
}

когда я делаю масштабирование, я ожидаю, что все дочерние элементы останутся видимыми, как это было раньше, и внутренняя область станет больше.

но вместо этого дочерние элементы перемещаются из Flickable содержимого.

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

спасибо.

1 ответов


Я получил его работу, как ожидалось, таким образом, но ИМО этот путь немного сложнее:

import QtQuick 2.1
import QtQuick.Controls 1.0

ApplicationWindow {
    width: 300
    height: 200

    Rectangle {
        anchors.fill: parent
        color: "green"

        Flickable {
            id: flickArea
            anchors {fill: parent; margins: 10; }
            contentWidth: rect.width*rect.scale
            contentHeight: rect.height*rect.scale
            Rectangle {
                id: rect
                transformOrigin: Item.TopLeft
                x: 0; y: 0;
                width: 200; height: 300;
                color: "lightgrey"

                Rectangle {
                    id: inner
                    anchors { fill: parent; margins: 10; }
                    color: "red"
                }
            }
        }
    }
    Button {
        anchors.bottom: parent.bottom;
        anchors.horizontalCenter: parent.horizontalCenter;
        text: "Scale flickArea"
        onClicked: {
            rect.scale += 0.2;
        }
    }
}

может кто-нибудь предложить что-то лучше?

UPD. Я не закрывал этот вопрос в течение 1 года, но все равно не получил лучшего решения или лучшего способа делать вещи.