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

Я разрабатываю приложение для представления данных, используя QT QML с QTCharts. Я использую ChartView и серию строк для отображения данных XY. Все работает, кроме сжатия и масштабирования графика. Приложение ориентировано на мобильное сенсорное устройство.

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

Возможно ли это в QML?

Спасибо за любую помощь.


person Martin Smith    schedule 26.04.2018    source источник


Ответы (1)


Решение состоит в том, чтобы использовать zoomIn(rect rectangle) метод, который может получить в качестве параметра прямоугольник, который будет виден, в вашем случае прямоугольник должен иметь в качестве центра точку, в которой вы щелкаете.

import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.0

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

    ChartView {
        id: chartView
        anchors.fill: parent
        theme: ChartView.ChartThemeBrownSand
        antialiasing: true

        LineSeries {
            name: "LineSeries"
            XYPoint { x: 0; y: 0 }
            XYPoint { x: 1.1; y: 2.1 }
            XYPoint { x: 1.9; y: 3.3 }
            XYPoint { x: 2.1; y: 2.1 }
            XYPoint { x: 2.9; y: 4.9 }
            XYPoint { x: 3.4; y: 3.0 }
            XYPoint { x: 4.1; y: 3.3 }
        }

        MouseArea{
            anchors.fill: parent
            onDoubleClicked: chartView.zoomReset();
        }

        PinchArea{
            id: pa
            anchors.fill: parent
            onPinchUpdated: {
                chartView.zoomReset();
                var center_x = pinch.center.x
                var center_y = pinch.center.y
                var width_zoom = height/pinch.scale;
                var height_zoom = width/pinch.scale;
                var r = Qt.rect(center_x-width_zoom/2, center_y - height_zoom/2, width_zoom, height_zoom)
                chartView.zoomIn(r)
            }

        }
    }
}
person eyllanesc    schedule 26.04.2018
comment
Спасибо за ответ. Я изучил масштабирование текста, но не могу понять, как определить размер прямоугольника при использовании жеста сжатия. - person Martin Smith; 27.04.2018
comment
Спасибо за ваш ответ. Я изучил использование зума в прямоугольнике. Но я не могу понять, как динамически создавать прямоугольник, используя информацию о жестах. - person Martin Smith; 27.04.2018
comment
@MartinSmith Хорошо, я только что понял, что вы хотите использовать жест Pinch Gesture, попробуйте мое обновленное решение. - person eyllanesc; 27.04.2018
comment
Великолепно, я попробую это сегодня и вернусь к вам. Большое спасибо. - person Martin Smith; 27.04.2018
comment
Это почти работает. Проблема в том, что диаграмма масштабируется. Он перемещает содержимое прямоугольника масштабирования в центр представления диаграммы. Я понимаю, что это то, что должна делать функция zoomIn(rect). поэтому я начинаю думать, что такого рода функциональность не может быть достигнута с помощью QT Chartview. - person Martin Smith; 27.04.2018