问题描述
我正在尝试在 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?
推荐答案
遗憾的是 ChartView
和 LineSeries
都没有 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上拖动一个点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!