Seite 1 von 1

multiple Instanzen von QChartView updaten

Verfasst: 24. März 2019 21:32
von sidvic
Hallo zusammen,

ich hab ein kleines Tool welches einfach 8 Charts anzeigen soll. (8xCPU Auslastung als LineSeries) Der Aufbau ist wie folgt:

zuerst das QChartView-Element in eigener qml-Datei:
Chart.qml

Code: Alles auswählen

import QtQuick 2.1
import QtCharts 2.1


ChartView {
	objectName: "chartView"+(index)
	id: chartview
	.....
	ValueAxis {
			id: xAxis
			.....
	}

	ValueAxis {
			id: yAxis
			......
	}
	LineSeries {
		id: lineSeries
		objectName: "LineSeries"+(index)
		axisX: xAxis
		axisY: yAxis
		XYPoint { x: index; y: 0.0 }
		XYPoint { x: 1.1; y: 3.2 }

	}
	Timer {
	......
    onTriggered: {
        manager.update_cpu_chart((index), parent.series(0));
    }
}
}
Der Aufruf in der main.qml sieht so aus:

Code: Alles auswählen

		Grid {
			 x: 0; y: 0
			 rows: 2; columns: 4; spacing: 0
			 Repeater { 
				model: 8
				id: chartRepeater
				Chart{}
			 }
		}
Als "backend" nehme ich statt C++ PySide2:
test.py

Code: Alles auswählen

    @Slot(int,QtCharts.QAbstractSeries)
    def update_cpu_chart(self, index, series):
        if series:
            line_series = QtCharts.QLineSeries(series)
            temp_list = self.core_temp.core_deques[index]
            l = []
            for i in range(0,len(temp_list )):
                l.append(QPointF(i,temp_list[i]))
            line_series.replace(l) 
Der Slot in Python wird auch aufgerufen und die Property objectName scheint auch zu stimmen. Leider wird das "replace" überhaupt nicht aufgerufen. Ich habe das Gefühl, dass ich auf einer falschen Instanz von QLineSeries werkel.

Ich bin leider was QML betrifft noch ein ziemlicher Neuling. Kann mir jemand auf die Sprünge helfen ob das Instanziieren der QChartsView soweit ok ist? wie würdet ihr das updaten der einzelnen Charts machen? Im Prinzip haben die alle die gleichen Achsen und sollen nur unterschiedliche Arrays darstellen.

Re: multiple Instanzen von QChartView updaten

Verfasst: 25. März 2019 13:43
von veeman

Code: Alles auswählen

        if series:
            line_series = QtCharts.QLineSeries(series)
            ....
            line_series.replace(l)
Das sieht mehr sehr suspekt aus.
Du erstellst ein neue QLineSerias-Instanz (mit dem parent als Ursprünglichen "line") füllst diese mit Daten und verwendest nicht mehr weiter.

Ein series.replace(l) sollte reichen.

Re: multiple Instanzen von QChartView updaten

Verfasst: 30. März 2019 14:37
von sidvic
Es lag tatsächlich an der neuen Instanz, eigentlich wollte ich nur casten...
Zusätzlich musste ich die Slot-Annotation noch anpassen (QAbstractSeries -> QObject, etwas unschön) da die replace() Methode der Basisklasse QAbstractSeries nicht passend war.

Vielen Dank für deine Antwort. :)