2

我有一个 qtchart,其线条在图表上带有 5 个点。我可以在axisX和axisY的最小值和最大值内的x和y轴上拖动这些点。如何禁用 x 轴上的点拖动?因此可以在图表上垂直拖动点。这是我的代码:

ChartView {
    id: chart
    property var selectedPoint: undefined
    anchors.fill: parent
    antialiasing: true
    property real toleranceX: 0.05
    property real toleranceY: 0.05

    ValueAxis {
        id: axisX
        min: 0
        max: 5
    }

    ValueAxis {
        id: axisY
        min: -10
        max: 10
    }

    LineSeries {
        id: series1
        axisX: axisX
        axisY: axisY
        pointsVisible: true            
    }

    MouseArea {
        anchors.fill: parent
        onPressed:
        {
            var cp = chart.mapToValue(Qt.point(mouse.x,mouse.y));
            for(var i = 0;i < series1.count;i ++)
            {
                var p = series1.at(i);
                if(Math.abs(cp.x - p.x) <= chart.toleranceX && Math.abs(cp.y - p.y) <= chart.toleranceY)
                {
                    chart.selectedPoint = p;
                    break;
                }
            }
        }
        onPositionChanged: {
            if(chart.selectedPoint != undefined) {
                var p = Qt.point(mouse.x, mouse.y);
                var cp = chart.mapToValue(p);
                if(cp.x >= axisX.min && cp.x <= axisX.max && cp.y >= axisY.min && cp.y <= axisY.max) {
                    series1.replace(chart.selectedPoint.x, chart.selectedPoint.y, cp.x, cp.y);
                    chart.selectedPoint = cp;
                }
            }
        }

        onReleased: {
            chart.selectedPoint = undefined;
        }
    }

}
// Add data to the series
Component.onCompleted: {
    for (var i = 0; i <= 5; i++) {            
        series1.append(i, Math.random());
    }
} 

到目前为止,在这种情况下,我可以通过更改onPositionChanged为以下代码来禁用 x 轴上的一个点的拖动,但有两个问题,首先这只是一个点,其次,它不会完全禁用拖动,而是该点可以是在 2 到 4 之间的 x 轴上拖动,但不能将其拖动到此范围之外。

 onPositionChanged: {
                if(chart.selectedPoint != undefined) {
                    var p = Qt.point(mouse.x, mouse.y);
                    var cp = chart.mapToValue(p);
                    if(cp.x >= axisX.min && cp.x <= axisX.max && cp.y >= axisY.min && cp.y <= axisY.max) {
                        if (Math.round(cp.x) == 3){
                              series1.replace(chart.selectedPoint.x, chart.selectedPoint.y, cp.x, cp.y);
                              chart.selectedPoint = cp;
                        }
                    }
                }
            }
4

0 回答 0