如何更改qml或PySide2中XYSeries中的所有点?

2024-09-10 21:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对PySide2和QML有点陌生,我真的需要一种方法同时替换XYSeries中的所有点。因为QML项没有这样做的函数,所以我想我必须创建一个自定义类(它将继承自QtCharts.QXYSeries公司),实现我需要的函数,然后向PySide2注册新类型。QtQml.qmlRegisterType,但我不知道该怎么做,我也没能在网上找到答案(或者至少找到一个答案)我能理解)。在

所以,长话短说,我需要知道的是,是否有一种方法可以更改XYSeries的所有点,以及如何进行更改(例如,创建一个自定义类并注册它,从python访问.qml文件中的Item declarend并更改其属性等等)。
我知道我的问题很模糊,但我不知道该去哪里看,该做什么。。。在

编辑

我有一个python类,它从仪器获取数据并生成X和Y点数组。因为这个阵列至少由1000个点组成,而且我需要至少1Hz的刷新率,所以一次添加一个点是不可能的(我有一个信号将整个阵列发送到qml接口,此时,我只需清除序列,一次添加一个XY对。它很管用,但太慢了)。在


Tags: 文件方法函数答案类型公司qmlpyside2
1条回答
网友
1楼 · 发布于 2024-09-10 21:37:52

一种可能的解决方案是创建一个允许从Python访问QML对象的类,在本例中,我创建了一个helper类,通过将序列与qproperty链接起来,我通过setContextProperty导出到QML。在

主.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_())

主.qml

^{pr2}$

相关问题 更多 >