Qt Chart绘制曲线需要注意事项-绘制Python返回的大量数据

1、工程配置:

需要在 .pro文件中加入  

QT       += charts

2、声明作用域

(类似 using namespace std), 否则无法正常使用其中的方法

QT_CHARTS_BEGIN_NAMESPACE

class QChart;

QT_CHARTS_END_NAMESPACE

QT_CHARTS_USE_NAMESPACE

3、获得Python返回的list,并转换为QT可用的数组

    PyObject* pylist=PyObject_CallFunction(pFun,NULL);      // pylist从python中获得的list的返回值,需进行转换

    int length=PyObject_Size(pylist);

    int signal_item;

    PyObject *list_item = NULL;

    for(int i=0;i<length;++i)

    {

        list_item = PyList_GetItem(pylist, i);

        signal_item=PyLong_AsLong(list_item);

        series->append(i,signal_item);         // 获得每一个转换后的返回值并进行append

    }

4、设置chart

    axis=new QValueAxis;

    series = new QSplineSeries();

    chart = new QChart();

    chart->addSeries(series);       // 后续如果想修改原来的series直接append就行了,图表会自动更新

    chart->legend()->hide();

    chart->createDefaultAxes();

    chart->setAxisX(axis,series);      //设置坐标必须在createDefaultAxes方法之后

    chart->axisX()->setRange(0,100);        

    chart->axisY()->setRange(-100,100);

    chart->setAnimationOptions(QChart::AllAnimations);  //动态画图

    chart->setTitle("Simple line chart example");

5、需要进行改进的地方及记录

(1)x 轴的坐标最大可以设置上百亿,不用担心坐标不够用的问题

(3)可以启动OpenGL加速图表的绘制

(4)当数据量大的时候关闭动态绘图,会节省很多的资源,绘图会快很多

(5)每次添加新数据的时候,尽量使用replace代替append,replace在官方文档里也有说明,比append要快很多,append添加2048就得大概一秒,而replace添加10000个点连续进行绘制显示都没什么问题。避免此坑

        https://blog.csdn.net/weixin_41712355/article/details/82217607

        https://blog.csdn.net/baidu_28572705/article/details/82423680

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用Qt for Python(PySide2)的示例代码,实现获取数据绘制实时动态折线图: ```python import sys import random import time from PySide2.QtCore import Qt, QThread, Signal from PySide2.QtGui import QPainter, QPen, QBrush from PySide2.QtWidgets import QApplication, QWidget class DataThread(QThread): dataChanged = Signal(float) def run(self): while True: # 模拟数据源,每隔1秒生成一组随机数据 data = random.randint(0, 100) self.dataChanged.emit(data) time.sleep(1) class DynamicLineChart(QWidget): def __init__(self): super().__init__() self.setWindowTitle('Dynamic Line Chart') self.setGeometry(100, 100, 800, 600) self.data = [] self.dataThread = DataThread() self.dataThread.dataChanged.connect(self.addData) self.dataThread.start() def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing, True) painter.setPen(QPen(Qt.black, 2, Qt.SolidLine)) painter.setBrush(QBrush(Qt.NoBrush)) # 绘制坐标轴 painter.drawLine(50, 550, 750, 550) painter.drawLine(50, 550, 50, 50) # 绘制折线图 if len(self.data) > 1: painter.setPen(QPen(Qt.red, 2, Qt.SolidLine)) for i in range(len(self.data) - 1): x1 = 50 + i * 10 y1 = 550 - self.data[i] * 5 x2 = 50 + (i + 1) * 10 y2 = 550 - self.data[i + 1] * 5 painter.drawLine(x1, y1, x2, y2) def addData(self, data): self.data.append(data) if len(self.data) > 70: self.data.pop(0) self.update() if __name__ == '__main__': app = QApplication(sys.argv) chart = DynamicLineChart() chart.show() sys.exit(app.exec_()) ``` 这个示例程序会每隔1秒生成一组随机数据,并实时绘制折线图。你可以将数据源替换为你自己的数据源,然后运行这个程序即可实现实时动态折线图的绘制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值