【Python_PyQtGraph 学习笔记(三)】基于GraphicsLayoutWidget实现显示曲线对象 鼠标位置处坐标的功能
基于GraphicsLayoutWidget实现显示曲线对象 鼠标位置处坐标的功能
前言
在PyQtGraph的官方例程中有此功能的实现,可参考Crosshair / Mouse interaction;但是坐标值的变化是超过整数时才变化,不符合实际开发中要求的精度。
在实现该功能的过程中主要参考了(详细分析)如何使用pyqt5和pyqtgraph在图像上增加图例并显示鼠标位置处的变量值,但是在获取鼠标所在位置的曲线的横纵坐标时使用了不同的方法,下面进行详细的介绍。
正文
首先要创建曲线对象:
self.__m_temCurveLst = [0] * 10 # 温度曲线数组self.__m_humCurveLst = [0] * 10 # 湿度曲线数组self.ui.temCurve = self.ui.Curve.plot(self.__m_temCurveLst, pen=pg.mkPen('black', width=1), name="温度曲线")self.ui.humCurve = self.ui.Curve.plot(self.__m_humCurveLst, pen=pg.mkPen('green', width=1), name="湿度曲线")
self.ui.Curve是图形对象PlotItem
如何基于GraphicsLayoutWidget创建曲线对象可以参考【Python_PyQtGraph 学习笔记】GraphicsLayoutWidget类的基本用法(持续更新)
之后的想法是:是否可以创建一个曲线上的点对象,然后获取鼠标的横坐标,根据鼠标的横坐标设置点对象的位置,这样曲线上的纵坐标就可以通过点对象的纵坐标而得到。
看文字可能不好理解,下面通过代码来进行展示。
创建坐标显示的标签:
self.ui.pwLabel = pg.LabelItem(justify='right') # 创建坐标的标签self.ui.pw.addItem(self.ui.pwLabel) # 将坐标添加到GraphicsLayoutWidget布局中来
创建曲线对象上的点对象:
self.temPoint = pg.CurvePoint(self.ui.temCurve) # 创建温度曲线上的点self.humPoint = pg.CurvePoint(self.ui.humCurve) # 创建湿度曲线上的点
又创建了一个箭头对象,可以更加清楚的看到点对象运动到了曲线对象的具体位置:
self.arrow = pg.ArrowItem(angle=90) # 创建一个箭头self.arrow.setParentItem(self.ui.temPoint) # 将箭头添加到温度点上
这个箭头功能实现后,如果不想要可以注释掉,单纯的是为了更加直观的看到点的运动位置。
创建鼠标跟随的十字线:
self.vLine = pg.InfiniteLine(angle=90, movable=False) # 鼠标跟随的垂直方向的线self.hLine = pg.InfiniteLine(angle=0, movable=False) # 鼠标跟随的水平方向的线self.ui.Curve.addItem(self.vLine, ignoreBounds=True)self.ui.Curve.addItem(self.hLine, ignoreBounds=True)
此功能也是属于可有可无的。
创建鼠标事件对象:
self.vb = self.ui.Curve.vb # 不含有坐标轴,但有鼠标功能的支持,获取鼠标事件,用户可以使用鼠标缩放/平移 ViewBox 的内容self.proxy = pg.SignalProxy(self.ui.Curve.scene().sigMouseMoved, rateLimit=60, slot=self.__f_mouseMoved)
鼠标移动槽函数的实现:
# 私有方法: GraphicsLayoutWidget 鼠标移动响应函数def __f_mouseMoved(self, evt):"""function:in:out:return: int >0 ok, <0 somewrongothers:"""pos = evt[0] # 使用信号代理将原始参数转换为元组,获取事件的鼠标位置mousePoint = self.vb.mapSceneToView(pos) # 鼠标所处的X轴坐标if self.ui.Curve.sceneBoundingRect().contains(pos): # 如果鼠标位置在绘图部件中if self.__m_curvePtr > 1: # 判断plot是否有大于一个点self.temPoint.setPos(mousePoint.x() / (self.__m_curvePtr - 1)) # Point设置位置的float类型范围是0-1self.humPoint.setPos(mousePoint.x() / (self.__m_curvePtr - 1)) # Point设置位置的float类型范围是0-1self.ui.pwLabel.setText("<span style='font-size: 12pt'>时间:%0.2f\n""<span style='color: black'>温度:%0.2f</span>\n""<span style='color: green'>湿度:%0.2f</span>\n"% (mousePoint.x(),self.temPoint.pos().y(),self.humPoint.pos().y()))# self.ui.pwLabel.setText("<span style='font-size: 12pt'>x:%0.2f\n"# "<span style='font-size: 12pt'>y:%0.2f</span>"# % (mousePoint.x(), mousePoint.y()))self.vLine.setPos(mousePoint.x()) # 设置垂直线的位置self.hLine.setPos(mousePoint.y()) # 设置水平线的位置
self.__m_curvePtr: 曲线指针,曲线列表中每添加i一个数,指针+1
注意: 我们所获取的鼠标横坐标mousePoint.x()这个是大于1的,但是点对象的setPos()方法设置的参数是0~1范围内的。所以需要得到目前已经绘制的点的数量,也就是曲线的长度,两者相除即可得到点对象在曲线对象中的比例。这样就可以把点设置到鼠标所在位置的曲线上来,也就能得到鼠标所在位置曲线的纵坐标。
实现的效果图:
【Python_PyQtGraph 学习笔记(三)】基于GraphicsLayoutWidget实现显示曲线对象 鼠标位置处坐标的功能相关推荐
- OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作
OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...
- 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX
文章目录 一.基于Ubuntu搭建Docker和portainer 1.Docker简介 2.Ubuntu20.04安装Docker-ce 3.Ubuntu20.04安装Docker图形化界面port ...
- Flask学习笔记(四):基于Flask网页显示图片
原图如下 代码如下 from flask import Flask, request, make_response from datetime import datetime import osapp ...
- freeCAD学习笔记三:复制草图中的对象
在绘制freeCAD中的草图时,肯定会产生这样的需要,就是想通过复制粘贴的方式来快速生成相似的对象,可是一开始没有找到如何复制草图的对象的菜单,还以为freeCAD不支持这个功能,后来才发现是没有找对 ...
- 【Python_PyQtGraph 学习笔记(五)】基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息
基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息 前言 基于PySide2.PyQtGraph和GraphicsLayoutWidget动态绘 ...
- 【Python_PyQtGraph 学习笔记(六)】基于GraphicsLayoutWidget 实现 曲线对象PlotDataItem 隐藏功能
基于GraphicsLayoutWidget 实现 曲线对象PlotDataItem 隐藏功能 前言 通过GraphicsLayoutWidget 可以绘制多条曲线.如果绘制多条曲线后,既想保存多条曲 ...
- Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作
Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...
- Ethernet/IP 学习笔记三
Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...
- 学习笔记之——基于深度学习的图像超分辨率重建
最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...
最新文章
- linux free命令详解和使用实例(查看内存使用率)
- acm pc^2的配置与使用
- 1.网页学习-开始学习第一步:
- C++ string字符串比较问题
- 3288 android5.1 编译,RK3288編譯 Android 5.1 固件
- Hdu 1072 【广搜】.cpp
- labelimg如何调整框的颜色_如何制作摄影集(下)
- 启动kafka报错:__consumer_offsets-22\00000000000000000000.index.swap: 另一个程序正在使用此文件,进程无法访问。
- 企业办公oa系统医药OA办公后台管理会议管理用户管理物料管理活动管理/Axure医药内部管理平台/web端后台管理系统原型/医药OA系统/权限管理
- 关于React的一切(updating...)
- python中不同类型的数据不能相互运算_python语法入门(数据类型、运算)
- SCUT - 12 - 西方国家 - 矩阵快速幂
- Qt 之 HTTP 请求下载(支持断点续传)
- 2020数学建模国赛A题 炉温曲线 心得
- 诺基亚E71 专用UCWEB 6.7
- 计算机无法识别打印机usb,USB无法识别打印机的解决方案和教程
- 计算机设置成一个网络,怎样将笔记本电脑设置成一个wifi热点
- eleme项目框架搭建及eslint常见报错(含图标字体库说明)
- CSR-I (WSJ0) Complete又名wsj0数据集
- 全球及中国冻干菠萝行业市场运行模式及未来发展前景分析报告2022-2028年