gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:10:57 25 4
gpt4 key购买 nike

我对 PySide2 和 QML 有点陌生,我真的需要一种方法来一次替换 XYSeries 中的所有点。由于 QML 项没有执行此操作的函数,因此我认为必须创建一个自定义类(继承自 QtCharts.QXYSeries),实现我需要的函数,然后使用 PySide2.QtQml.qmlRegisterType 注册新类型,但我不知道应该如何做,而且我无法在网上找到答案(或至少是我能理解的答案)。

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

编辑

我有一个 python 类,它从仪器获取数据并生成 X 和 Y 点数组。由于该数组至少由 1000 个点组成,并且我需要至少 1Hz 的刷新率,因此不可能一次添加一个点(我有一个信号将整个数组发送到 qml 接口(interface),并且目前,我只需清除该系列并一次添加一对 XY。它可以工作,但速度太慢了)。

最佳答案

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

ma​​in.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_())

ma​​in.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
}
}

关于python - 如何更改 qml 或 PySide2 中 XYSeries 中的所有点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55257134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com