在qml中的qtcharts上拖动一个点

在qml中的qtcharts上拖动一个点

本文介绍了在qml中的qtcharts上拖动一个点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 qtcharts 上的 LineSeries 上拖动一个点.这是我的代码:

I am trying to drag a point on LineSeries on qtcharts. Here is my code:

import QtQuick 2.0
import QtCharts 2.0

Item {
    anchors.fill: parent

    ChartView {
        title: "Two Series, Common Axes"
        anchors.fill: parent

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

        ValueAxis {
            id: axisY
            min: -0.5
            max: 1.5
        }

        LineSeries {
            id: series1
            axisX: axisX
            axisY: axisY
            onPressed: console.log("Pressed: " + point.x + ", " + point.y);
            onReleased: console.log("Released: " + point.x + ", " + point.y);
        }


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

当我按下 Lineserie 上的一个点时,我可以在控制台中看到我按下和释放的点的 x,y.两者都是一样的,所以我看不到它发布的地方.我想将一个点拖到另一个地方,所以如果我按下一个点,它会跟随(触摸屏上的鼠标/手指)指针,直到我在图表上松开为止.任何人都可以帮助我从哪里开始以及我应该使用哪些属性?

When I press a point on the Lineserie I can see x,y of the point I have pressed and released in the console. Both are the same though, so I cannot see the place where it released. I'd like to drag a point to another place, so if I press a point it follows the (mouse/finger on touch screen) pointer until I release on the graph. Anyone can help a bit where to start and which properties should I use?

推荐答案

遗憾的是 ChartViewLineSeries 都没有 MouseMove 事件,因此很难跟踪拖动事件.我有一个使用 MouseArea 放置在图表上的解决方法.也许是一个愚蠢的解决方案,但至少它有效.我已将其用于您的示例:

Unfortunately both ChartView and LineSeries have no MouseMove event so it's hard to track dragging event. I have a workaround using MouseArea placing over the chart. Maybe a stupid solution but at least it works. I've adopted it to your example:

ChartView {
    id: chart
    property var selectedPoint: undefined
    title: "Two Series, Common Axes"
    anchors.fill: parent
    antialiasing: true
    property real toleranceX: 0.05
    property real toleranceY: 0.05

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

    ValueAxis {
        id: axisY
        min: -0.5
        max: 1.5
    }

    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 dynamically to the series
Component.onCompleted: {
    for (var i = 0; i <= 10; i++) {
        series1.append(i, Math.random());
    }
}

这篇关于在qml中的qtcharts上拖动一个点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-26 16:14