Получить имя QML ChartView LineSeries при нажатии LineSeries
Я создал программу, которая считывает биржевые данные (временные ряды) из Интернета и отображает их в QML ChartView. После того, как я добавлю все нужные мне серии линий, я могу удалить их, нажав кнопку.
Я хотел бы знать, возможно ли удалить ряд линий, нажав на ЛЮБУЮ точку в ряду линий?
Я добавляю серию динамически, как это:
// stockID is sent from C++ when the timeSeriesReady signal is emitted
var chartViewSeries = chartView.createSeries(ChartView.SeriesTypeLine, stockID, dateTimeAxis_chartView_xAxis, valueAxis_chartView_yAxis);
// Set chartViewSeries (AbstractSeries/LineSeries) properties
chartViewSeries.onClicked.connect(lineSeriesClicked);
chartViewSeries.onHovered.connect(lineSeriesHovered);
stockChart.setLineSeries(chartViewSeries);
Я не хочу переполнять мой пост, поэтому я не буду публиковать ВСЕ файлы, однако:
- dateTimeAxis_chartView_xAxis - это тип DateTimeAxis QML внутри основного типа ChartView QML с id: chartView
- valueAxis_chartView_yAxis - это тип ValueAxis QML внутри основного типа ChartView QML с id: chartView
- stockChart - это идентификатор типа StockMLhart QML, импортированного из C++
lineSeriesClicked это функция:
function lineSeriesClicked(lineSeriesPoint){ console.log(lineSeriesPoint); }
lineSeriesHovered это функция:
function lineSeriesHovered(lineSeriesPoint, isHovered){ if(isHovered){ var date = new Date(lineSeriesPoint.x); console.log(date.getFullYear() + "-" + (((date.getMonth()+1) < 10) ? ("0" + (date.getMonth()+1).toString()) : (date.getMonth()+1)) + "-" + (((date.getDate()) < 10) ? ("0" + (date.getDate()).toString()) : (date.getDate())) + " -> " + lineSeriesPoint.y); } }
Теперь в журнале я вижу все правильные данные, например, при зависании:
qml: 2017-08-29 -> 64.91115963918442
при нажатии:
qml: QPointF(1.50432e+12, 65.0453)
Если посмотреть на тип QML XYSeries ( https://doc.qt.io/qt-5/qml-qtcharts-xyseries.html), то используемый мной сигнал щелчка передает только точку.
Есть ли способ получить имя ряда линий, где были получены данные точек, чтобы можно было удалить этот ряд? Возможно, через какой-то контекстный доступ или ключевое слово this?
Большое спасибо!!!
1 ответ
Я не знаю, решите ли вы это, но только для документации... Я мог бы решить это, используя модель-представление-делегат. В моем примере я использую данные датчика для генерации графики, и мне бы хотелось, чтобы я мог соединить различные графические элементы (например, круговую диаграмму и линию) с помощью метки серии. Я мог бы сделать это, используя эту перспективу модель-представление-делегат. Я понял это так:
import QtQuick 2.2
import QtQuick.Controls 2.3
import QtQuick.Window 2.10
import QtQuick.Layouts 1.3
import QtDataVisualization 1.2
import QtCharts 2.2
import Qt3D.Input 2.0
// I imported more than I used because it's a part of a big project...
Item{
id: mainWindow
ListModel{
id: jsonData
Component.onCompleted: // line
{
//create a request and tell it where the json that I want is
var req = new XMLHttpRequest();
var location = "URL-to-JSON-DATA"
//tell the request to go ahead and get the json
req.open("GET", location, true);
req.send(null);
//wait until the readyState is 4, which means the json is ready
req.onreadystatechange = function()
{
console.log("Req status:"+req.status+"("+req.readyState+")");
if (req.readyState == 4)
{
//turn the text in a javascript object while setting the ListView's model to it
if (req.responseText){
var result = JSON.parse(req.responseText);
for (var i =0; i < result.rows.length;i++){
// map the Json to a model
jsonData.append({"sensor":result['rows'][i]['value'][0],"activePower": result['rows'][i]['value'][1],"voltage":result['rows'][i]['value'][2], "current":result['rows'][i]['value'][3], "year":result['rows'][i]['key'][0],"month": result['rows'][i]['key'][1],"day":result['rows'][i]['key'][2], "hour":result['rows'][i]['key'][3], "minute":result['rows'][i]['key'][4] })
};
//Sucess string
console.log("JSON [Sensor,Date,Hour] loaded");
//Fail string :(
} else {console.log("Empty[Sensor,Date,Hour JSON");}
}
}
}
}
ChartView {
title: "Line"
id: mainChart
anchors.fill: parent
antialiasing: true
Repeater{
model: jsonData
Item {
Component.onCompleted: {
if( mainChart.series(sensor)) {
mainChart.series(sensor).append(10,activePower);
} else{
mainChart.createSeries(ChartView.SeriesTypeLine,sensor,lineXOrdinate,lineYOrdinate );
mainChart.series(sensor).append(hour+(minute*0.5)/30,activePower);
mainChart.series(sensor).hovered.connect(
function (point,state){
if (state){
console.log(">>>"+sensor); // print the Series label =D
}
});
}
if(activePower > lineYOrdinate.max){ // if the highest value is above the Y axis, reset it to value+10
lineYOrdinate.max = activePower +10;
}
}
}
}
}
ValueAxis {
id: lineYOrdinate
min:0
max:11
}
ValueAxis {
id: lineXOrdinate
min:0
max:24
}
}
Ось X имеет длину 24 значения, потому что я отображаю день. Надеюсь это поможет =)