我是PySide2和QML的新手,我真的需要一种方法来一次替换XYSeries中的所有点。由于QML项没有执行此操作的功能,因此我认为必须创建一个自定义类(该类将从QtCharts.QXYSeries继承),实现所需的功能,然后向PySide2.QtQml.qmlRegisterType注册新类型,但我不知道该怎么做,也无法在线找到答案(或至少我能理解的答案)。
因此,总而言之,我需要知道的是是否有办法更改XYSeries的所有点以及如何完成(例如,创建自定义类并注册它,访问中的Item声明数)。来自python的qml文件并更改其属性等)。
我知道我的问题确实很模糊,但我不知道在哪里看以及该怎么做...
编辑
我有一个python类,它从一种仪器获取数据并生成X和Y点的数组。由于此阵列是由至少1000个点组成的,并且由于我需要具有至少1Hz的刷新率,所以不可能一次添加一个点(我有一个信号将整个阵列发送到qml接口,暂时,我只需要清除序列并一次添加一对XY对即可。它虽然有效,但是实在太慢了)。
一种可能的解决方案是创建一个类,该类允许从Python访问QML对象,在这种情况下,我通过将序列与qproperty链接来创建通过setContextProperty导出到QML的助手类。
main.py
import random
from PySide2 import QtCore, QtWidgets, QtQml
from PySide2.QtCharts import QtCharts
class Helper(QtCore.QObject):
serieChanged = QtCore.Signal()
def __init__(self, parent=None):
super(Helper, self).__init__(parent)
self._serie = None
def serie(self):
return self._serie
def setSerie(self, serie):
if self._serie == serie:
return
self._serie = serie
self.serieChanged.emit()
serie = QtCore.Property(QtCharts.QXYSeries, fget=serie, fset=setSerie, notify=serieChanged)
@QtCore.Slot(list)
def replace_points(self, points):
if self._serie is not None:
self._serie.replace(points)
class Provider(QtCore.QObject):
pointsChanged = QtCore.Signal(list)
def __init__(self, parent=None):
super(Provider, self).__init__(parent)
timer = QtCore.QTimer(
self,
interval=100,
timeout=self.generate_points
)
timer.start()
@QtCore.Slot()
def generate_points(self):
points = []
for i in range(101):
point = QtCore.QPointF(i, random.uniform(-10, 10))
points.append(point)
self.pointsChanged.emit(points)
if __name__ == '__main__':
import os
import sys
app = QtWidgets.QApplication(sys.argv)
helper = Helper()
provider = Provider()
provider.pointsChanged.connect(helper.replace_points)
engine = QtQml.QQmlApplicationEngine()
engine.rootContext().setContextProperty("helper", helper)
file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "main.qml")
engine.load(QtCore.QUrl.fromLocalFile(file))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.3
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
ChartView{
anchors.fill: parent
LineSeries{
id: serie
axisX: axisX
axisY: axisY
}
ValueAxis {
id: axisX
min: 0
max: 100
}
ValueAxis {
id: axisY
min: -10
max: 10
}
Component.onCompleted: helper.serie = serie
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句