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

兰多1784

我是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在QtCreator中配置PySide2 + QML?

如何在PySide2中更改图形的颜色

Swift如何在PageControl中显示所有点

如何使用PySide2在qml中设置值?

如何在参数集的Catersian乘积中调用包含所有点的宏?

如何在Android中找到路径中的所有点?

如何在OpenCvSharp中获取一条线上的所有点?

如何选择特定圆中的所有点?

如何从csv文件中删除所有点?

如何使用CImg调整屏幕中的所有点

如何在QML / Pyside2中创建鼠标按下或单击事件而无需实际按下鼠标

如何在vim中删除带有点的单词

如何在C中打印带有点的2D数组

如何使用PySide2 Python后端将PyQtGraph嵌入QML中?

在PySide2中协调绘制线和点

如何在Oracle SQL中用空字符串替换电子邮件中@之前的所有点?

ggplot2中的geom_line无法连接所有点。为什么?如何解决?

SQL几何查找半径中的所有点

替换括号中包含的所有点

T-SQL /查找列中的所有点

如何在不检查画布上的每个点的情况下获取SVG路径字符串中包含的所有点?

如何在pyside2中关闭另一个窗口?

如何在PySide2中将QByteArray转换为python字符串

如何在PySide2中使用QLabel加载图像

如何在PySide2中添加边框或设置透明的QLayout?

如何在PySide2中检查gui vs命令行模式?

如何在PySide2中将python列表转换为QVariantList

如何在 PySide2 中添加框架以滚动小部件

如何使用GeoTools在shapeFile .shp中获取多边形的所有点?