Как использовать QML Scale Element для инкрементального масштабирования с другим источником

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

Чтобы воспроизвести проблему, запустите приведенный ниже минимальный пример QML (я использую Qt 5.3.1 в Ubuntu 14.04 x86_64) и затем:

Нажмите в центре синего прямоугольника в левом верхнем углу.Убедитесь, что все масштабировано, но центр синего прямоугольника остается в вашем месте щелчка. Это как описано вhttp://doc.qt.io/qt-5/qml-qtquick-scale.html - «[Исходная точка] содержит точку, от которой масштабируется элемент (то есть точка, которая остается фиксированной относительно родителя по мере роста остальной части элемента)».Теперь нажмите в центре красного прямоугольника.Посмотрите, что все масштабируется, но центр красного прямоугольника сделалне оставаться в точке щелчка, он был переведен вверх и влево. Это не так, как задокументировано.

Моя цель - иметь этовсегда правильно масштабируйте, сохраняя точку щелчка в качестве источника, как указано в документации.

Постскриптум Интересно, что если вы теперь снова нажмете в центре красного прямоугольника, он увеличится вокруг этой точки, как и было обещано. Теперь, снова кликнув по центру синего прямоугольника, вы увидите то же неожиданное поведение перевода.

P.P.S. Я работаю над приложением, в котором пользователь может поворачивать / зажимать мышью любое место в содержащем прямоугольнике, и все внутри должно увеличиваться или уменьшаться вокруг положения мыши / зажима. Многие приложения имеют именно такое поведение. Смотрите, например, Inkscape.

import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        x: 100
        y: 100
        width: 300
        height: 300

        transform: Scale {
            id: tform
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                console.log(mouse.x + " " + mouse.y)
                tform.xScale += 0.5
                tform.yScale += 0.5
                tform.origin.x = mouse.x
                tform.origin.y = mouse.y
            }
        }

        Rectangle {
            x: 50
            y: 50
            width: 50
            height: 50
            color: "blue"
        }

        Rectangle {
            x: 100
            y: 100
            width: 50
            height: 50
            color: "red"
        }

    }

}

(Я подал это как ошибку Qt, потому что поведение не соответствует документации. На момент написания, ошибка, похоже, была обработана как «важная».https://bugreports.qt.io/browse/QTBUG-40005 - Я все еще очень открыт для предложений об обходах / исправлениях здесь)

Ответы на вопрос(1)

Ваш ответ на вопрос