PDA

View Full Version : Adding right axis in QtQuick ChartView changes also left axis



Marc Wouters
23rd January 2017, 11:55
Hi,

I want dynamically change LineSeries in a QML ChartView. I'm using Qt 5.7
For this purpose, I have a variable 'updateChart', which triggers the replacement of existing LineSeries, using removeAllSeries() and createSeries()

Sometimes, a LineSeries needs to be displayed using a secondary axis (right axis).
The ChartView createSeries() doesn't allow to assign a right axis to a LineSeries, and from the documentation I cannot find an alternative.

Additionally, you need to have already an axis before calling the createSeries method.
Therefor I have declared 3 axes (X, Y left, Y right) in the ChartView for using them in the createSeries call. The min/max values are modified in another view and kept in the 'chartContext'.
After creation, I change the axisY to axisYRight.

The problem is that my ChartView displays the same axis (min/max values) on both sides. When I change one of the minima/maxima, it updates to that last value, even mixing the minimum from the left axis with the maximum from the right axis.

How can I avoid this ?
Below is my (shortened) code :
chartContext and dataModel are C++ contexts



ChartView {
id: linechart;
anchors.fill: parent;

property var updateChart: chartContext.updateChart;

title: chartContext.chartTitle;
antialiasing: true;

ValueAxis {
id: xAxis;
min: chartContext.minXAxis;
max: chartContext.maxXAxis;
}
ValueAxis {
id: yAxis;
min: chartContext.minYAxis;
max: chartContext.maxYAxis;
}
ValueAxis {
id: yAxis2;
min: chartContext.minYAxis2;
max: chartContext.maxYAxis2;
}

onUpdateChartChanged: {
linechart.removeAllSeries();

for (var i = 0; i < dataModel.numberOfSeries; ++i) {
var lineSeries;
if (dataModel.axisLocation(i) == "Right") {
lineSeries = linechart.createSeries(ChartView.SeriesTypeLine, dataModel.getYLabel(i), xAxis);
lineSeries.axisYRight = yAxis2;
}
else {
lineSeries = linechart.createSeries(ChartView.SeriesTypeLine, dataModel.getYLabel(i), xAxis, yAxis);
}
var point;
for (var j = 0; j < dataModel.getNumberOfDataPoints(i); ++j) {
point = lineSeries.append(dataModel.getXValue(i,j), dataModel.getYValue(i,j));
}
lineSeries.pointsVisible = true;
}