【问题标题】:draging a point on qtcharts in qml在 qml 中的 qt 图表上拖动一个点
【发布时间】:2018-07-25 04:23:58
【问题描述】:

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

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。不过两者都是一样的,所以我看不到它发布的地方。我想将一个点拖到另一个地方,所以如果我按下一个点,它会跟随(触摸屏上的鼠标/手指)指针,直到我在图表上释放。任何人都可以帮助我从哪里开始以及我应该使用哪些属性?

【问题讨论】:

  • 有一些点是连接属于该系列的点的线的一部分,如果按下这些点会发生什么?他们应该搬家吗?移动这些点意味着在曲线中创建新点。
  • 是的,它们应该移动,正如你所说,它会导致在图中创建新点

标签: qt qml qt5 qtcharts


【解决方案1】:

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

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());
    }
} 

【讨论】:

  • 非常感谢您提供有效的答案,我的情况是我应该将公差X 增加到 0.5 以便能够抓住图表上的点。这段代码仍然存在两个小问题。首先,我可以拖动 X 轴和 Y 轴之外的点,我的意思是图表上的网格线。另一个问题是,由于我确实有两个 LineSeries,series1 和 series2 有时两个图上的两个点彼此太近,所以当我尝试拖动其中一个时,它们粘在一起并且无法逃脱从中。您对解决这些问题有什么建议吗?
  • 我已更新示例以解决将点移出字段的问题。至于选择系列我不知道,也许你可以通过按键修改或其他方式选择必要的系列
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多