python-使用Qchart总结5-使用信号槽绘制动态曲线图

news2024/11/18 13:45:19

python-使用Qchart总结3-绘制曲线图在这篇文章基础上,来改造一下,绘制一下动态曲线图吧

一、明确需求

①点击按钮,开始动态加载曲线,细节:一个一个点加载出来

二、实现

①在UI上添加按钮,打开原先的untitled.ui文件,添加一个按钮,更改名字,保存文件

②重新生成UI的py文件,右键选中后选择重新编译

③先把静态添加的点隐藏

数据源:采用线程发送数据,所以先创建一个线程发送的方法,上代码

A=[(1, 40),(2, 99),(3,76)]#要发送的数据
class DataRefresh(QThread):
    dataRefreshed = pyqtSignal(list) #表示发送过去的是数组类型,所以注意下面 emit里面传的需要是数组类型
    def run(self):
        global c
        c=0
        print(c)
        while c<len(A):#因为是一个一个点绘制,所以一个一个点传送,注意:需要循环,不然只会发送1遍
            self.dataRefreshed.emit(list(A[c]))

            time.sleep(5)
            c=c+1

插入位置:主类外面即可

⑤因为需要点击按钮开始绘制动态曲线,所以就是按钮需要与上述④的线程发送数据关联,来启动线程,所以在下图所示的地方添加连接信号,每一个大概意思都标明,可自行理解;

说明:实例化线程就是上述④里写的类,实例化,得到一个对象,然后把这个对象带的数据传给

self.plot_qchart.handle_update这个方法

 

上代码

class Window(QMainWindow, Ui_MainWindow):#这个是将图表与UI图连接起来
    def __init__(self):
        super().__init__()
        self.setup_ui()  # 渲染画布
        self.connect_signals()

    def setup_ui(self):
        self.setupUi(self)

        self.plot_qchart = User_QSplineSeries() #将图表实例化
        self.graphicsView.setChart(self.plot_qchart)
        self.graphicsView.setRenderHint(QPainter.Antialiasing)  # 抗锯齿
        self.graphicsView.setRubberBand(QChartView.RectangleRubberBand)

    def connect_signals(self):#连接信号

        self.dataRefreshThread=DataRefresh()
        self.pushButton.clicked.connect(self.start_thread)  # 跑线程
        self.dataRefreshThread.dataRefreshed.connect(self.plot_qchart.handle_update) #新的视频任务进入时候后面加进去

    def start_thread(self):
        print("线程开始")
        self.dataRefreshThread.start()

⑥数据发过来了,要显示在曲线图上,曲线图上就需要有个对象来接收一下,所以要在曲线图的类里面加一个接收函数即上述所说的

self.plot_qchart.handle_update来接收,所以要在绘制曲线的类里面,写一下接收的函数

在绘制的曲线图的类里面 加一个接受函数,需要注意传过来的格式,先看看传过来的数据格式

所以接收的ydata就是[1,40]这样的数据类型,通过append给曲线添加点,把数据绘制在曲线图上

def handle_update(self,ydata):#注意,传过来的格式
    self.series.append(QPointF(ydata[0],ydata[1]))

⑦实现效果

三、全部代码

 

import sys
import time

from PyQt5.Qt import *
from PyQt5.QtChart import QChartView, QChart, QValueAxis, QSplineSeries
from PyQt5.QtGui import QPainter, QColor, QFont

from PyQt5.QtWidgets import QMainWindow, QApplication

from untitled import Ui_MainWindow #从生成好的py文件内导入设计好的UI类



A=[(1, 40),(2, 99),(3,76)]
class DataRefresh(QThread):
    dataRefreshed = pyqtSignal(list) #表示发送过去的是数组类型,所以注意下面 emit里面传的需要是数组类型
    def run(self):
        global c
        c=0
        print(c)
        while c<len(A):#因为是一个一个点绘制,所以一个一个点传送,注意:需要循环,不然只会发送1遍
            self.dataRefreshed.emit(list(A[c]))

            time.sleep(5)
            c=c+1

class Window(QMainWindow, Ui_MainWindow):#这个是将图表与UI图连接起来
    def __init__(self):
        super().__init__()
        self.setup_ui()  # 渲染画布
        self.connect_signals()

    def setup_ui(self):
        self.setupUi(self)

        self.plot_qchart = User_QSplineSeries() #将图表实例化
        self.graphicsView.setChart(self.plot_qchart)
        self.graphicsView.setRenderHint(QPainter.Antialiasing)  # 抗锯齿
        self.graphicsView.setRubberBand(QChartView.RectangleRubberBand)

    def connect_signals(self):#连接信号

        self.dataRefreshThread=DataRefresh()
        self.pushButton.clicked.connect(self.start_thread)  # 跑线程
        self.dataRefreshThread.dataRefreshed.connect(self.plot_qchart.handle_update) #新的视频任务进入时候后面加进去

    def start_thread(self):
        print("线程开始")
        self.dataRefreshThread.start()

class User_QSplineSeries(QChart): #绘制曲线图
    def __init__(self, parent=None, ):
        super(User_QSplineSeries, self).__init__(parent)
        self.window = parent
#设置x轴
        self.axisX = QValueAxis()
        self.axisX.setRange(0, 10)#X轴的范围
        self.axisX.setTickCount(11)
        self.axisX.setLabelFormat("%d")#X轴上数字显示的类型
        self.axisX.setLabelsColor(QColor(0, 0, 0))  # X轴上显示数字的颜色
        self.addAxis(self.axisX, Qt.AlignBottom)  #X轴放底部
# 设置y轴
        self.axisY = QValueAxis()
        self.axisY.setRange(0,200)#Y轴的范围
        self.addAxis(self.axisY, Qt.AlignLeft) #设置Y坐标放在左侧
        self.axisY.setTitleText("单位:分钟")#设置Y坐标的名称

        self.setTitle("视频时长曲线图")#设置整个图表的标题
        self.setTitleFont(QFont("微软雅黑"))#设置整个图表的标题的字体
        #----------------------------------------
#添加曲线
        self.series =QSplineSeries() #使用曲线
        self.series.setName("视频提示等待时长") #设置曲线的名字
# 添加曲线上的点,添加数据用这个
#         self.series.append(1,60)
#         self.series.append(2,50)
#         self.series.append(8,90) #给曲线添加值 x=8 y=90的意思;分别加了2个点
#--------
        self.series.setVisible(True)#将曲线显示出来
#设置曲线上点的显示
        font = QFont()
        font.setPointSize(12)
        self.series.setPointLabelsFont(font)#给显示的点坐标设置字体大小
        self.series.setPointLabelsFormat("@yPoint分钟  ")#设置点坐标显示的格式
        self.series.setPointLabelsVisible(True)#将点坐标显示出来
        self.series.setPointLabelsClipping(False)
#将曲线加到坐标图里面去
        self.addSeries(self.series)
        self.series.attachAxis(self.axisX)#让曲线与坐标轴对应
        self.series.attachAxis(self.axisY)
        self.series.setColor(QColor(126,211,33))#设置曲线的颜色

    def handle_update(self,ydata):
        self.series.append(QPointF(ydata[0],ydata[1]))

if __name__ == "__main__":

    app = QApplication(sys.argv)
    mywindow = Window()
    mywindow.show()
    sys.exit(app.exec_())

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】浅谈eloop机制

目录 1.eloop 机制 2.eloop结构体 2.1.eloop_data结构体 2.2 Socket事件结构体 2.3 Timeout事件结构体 2.4 Signal事件结构体 3.eloop_init 4.eloop_run 4.1 signal事件 4.2 socket事件 4.3 timeout事件 1.eloop 机制 主线程中启动事件监听机制&#xff0c;对不同的…

【Python入门】字符串的扩展

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

Nginx介绍及安装

简介 Nginx 是一个高性能的 HTTP 和反向代理服务器。它最初由 Nigel Cook 开发&#xff0c;旨在解决 Apache 服务器在高并发环境下性能瓶颈的问题。Nginx 具有占用资源少、处理能力强等优点&#xff0c;在互联网应用中广泛应用于静态资源服务、反向代理、负载均衡、HTTP缓存、…

2023年web前端开发之JavaScript进阶(一)

接上篇博客进行学习,通俗易懂,详细 博客地址: 2023年web前端开发之JavaScript基础(五)基础完结_努力的小周同学的博客-CSDN博客 学习内容 学习 作用域、变量提升、 闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0…

rs485转tcp网关盒子怎么用(rs485协议转以太网tcp/ip)

随着工业自动化技术的不断发展&#xff0c;越来越多的工业设备在使用时需要进行数据通信。其中&#xff0c;RS485通信协议是一种常见的工业通信协议&#xff0c;而TCP/IP协议则是互联网通信的标准协议。为了实现RS485协议与TCP/IP协议之间的通信&#xff0c;可以使用RS485转TCP…

【Java】面试常问知识点(Java基础—2)

Java基础 多线程的状态 新建状态 当用new操作符创建一个线程时&#xff0c; 例如new Thread(r)&#xff0c;线程还没有开始运行&#xff0c;此时线程处在新建状态。 当一个线程处于新生状态时&#xff0c;程序还没有开始运行线程中的代码 就绪状态 一个新创建的线程并不自动…

ChatGLM-6B微调与部署

文章目录 基于ChatGLM-6B的推理与部署配置环境与准备配置环境模型文件准备 代码运行 Demo命令行 Demo基于 Gradio 的网页版 Demo基于 Streamlit 的网页版 Demo 基于peft框架的LoRA微调ChatGLM-6B配置环境与准备配置环境模型文件准备数据准备数据处理 微调过程 基于P-Tuning v2微…

stm32影子寄存器、预装载寄存器,TIM_OC1PreloadConfig和TIM_ARRPreloadConfig的作用

一直没搞清楚stm32定时器的TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数的作用&#xff0c;影子寄存器、预装载寄存器、重载寄存器的概念。今天来研究一下&#xff1a; 首先看定时器的框图&#xff1a; 图中有阴影的小方框&#xff0c;代表该功能对应的寄存器有影子寄存器&…

Canal实战使用(集群部署)和原理解析

1.mysql数据同步工作原理 MySQL master将数据变更写入二进制日志(binary log&#xff0c;其中记录叫做二进制日志事件binary log events&#xff0c;可以通过 show binlog events 进行查看) MySQL slave将master的binary log events拷贝到它的中继日志(relay log) MySQL slav…

Java基础(十八)网络编程

1. 网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&am…

软件测试培训了几个月,找到工作了,面试经验分享给各位

面试问的一些基本问题 功能方面&#xff1a;问的最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等…

无线之红外线技术的组网方式详解

红外线(Infrared rays)也是一种光线&#xff0c;由于它的波长比红色光750nm)还长&#xff0c;超出了人眼可以识别的可见光&#xff09;范围&#xff0c;所以我们看不见它&#xff0c;又称为红外热辐射(Infrared radiation)&#xff0c;通常把波长为0.75&#xff5e;1000μm的光…

腾讯高工手写13W字“Netty速成手册”,3天走向实战

前言 在java界&#xff0c;netty无疑是开发网络应用的拿手菜。你不需要太多关注复杂的nio模型和底层网络的细节&#xff0c;使用其丰富的接口&#xff0c;可以很容易的实现复杂的通讯功能。 作为当前最流行的NIO框架&#xff0c;Netty在互联网领域、大数据分布式计算领域、游…

【Linux0.11代码分析】02 之 bootsect.s 启动流程

【Linux0.11代码分析】02 之 bootsect.s 启动流程 一、boot\bootsect.s1.1 将bootsect.s 从0x7c00 移动到 0x90000 &#xff08;512byte&#xff09;1.2 使用 int 0x13 中断加载 setup.s 程序到 0x902001.3 获取并解析磁盘驱动器的参数1.4 开始加载 System模块到 0x10000 地址1…

计算机网络之应用层

文章目录 应用层1. 应用层协议原理1.1 网络应用程序体系结构1.2 进程通信1.3 可供程序使用的运输服务1.4 因特网提供的运输服务1.5 应用层协议 2.Web应用和HTTP协议2.1 HTTP概况2.2 非持久连接和持久连接2.3 HTTP报文格式2.4 用户服务器的交互&#xff1a;cookie2.5 Web缓存器 …

数字医疗算法应用创新大赛-食品与疾病关系预测算法赛道top5方案分享

一、比赛地址和背景 1.1 比赛地址 比赛地址 1.2 数据说明及任务 本次算法赛将提供超过 23.5W 的食物、疾病对应关系及其量化得分&#xff0c;其中食物特征超过 200 个&#xff0c;疾病特征由 3 种不同的方式抽取&#xff0c;累积超过 4000 个特征信息。初赛为 0、1 二分类预…

递归递推练习题

1.用递归的方法123…N的值&#xff08;in:5,out:15&#xff09; 2.输出斐波那契数列的第N项&#xff0c;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13…(in:3,out:1) 3.求n!&#xff08;in:5,out:120&#xff09;n!123……

STM32启动/下载模式

启动模式 主闪存存储器区存放用户设计的代码&#xff0c;代码烧录到这里&#xff0c;一般情况在正常工作时需要把STM32设置为从这里启动。 系统存储器区用来实现ISP功能的。 内嵌SRAM区用来实现调试器调试功能的。 ISP ISP一般由PC机通过串口把bin/hex文件直接烧写到单片机内…

java并发编程之美第五章读书笔记

java并发包中并发List源码剖析 介绍 CopyOnWriteArrayList 线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)进行的,也就是写时复制策略 类图 每一个对象里面有一个array数组进行存放具体的元素,ReentrantLock独占锁对象用来保证同时只有一个线程对…

Maven中optional标签详解

这一篇文章应该是全网讲解optional最细致的&#xff0c;因为我都是拿我自己的试验来证明&#xff0c;从试验当中也发现了很多出乎意外的知识&#xff01;感兴趣的跟着小编一块来学习呀&#xff01; 目录 一、前言二、依赖传递代码演示三、是否会影响父子工程之间的依赖继承呢&a…