基于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实现显示曲线对象 鼠标位置处坐标的功能相关推荐

  1. OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作

    OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...

  2. 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX

    文章目录 一.基于Ubuntu搭建Docker和portainer 1.Docker简介 2.Ubuntu20.04安装Docker-ce 3.Ubuntu20.04安装Docker图形化界面port ...

  3. Flask学习笔记(四):基于Flask网页显示图片

    原图如下 代码如下 from flask import Flask, request, make_response from datetime import datetime import osapp ...

  4. freeCAD学习笔记三:复制草图中的对象

    在绘制freeCAD中的草图时,肯定会产生这样的需要,就是想通过复制粘贴的方式来快速生成相似的对象,可是一开始没有找到如何复制草图的对象的菜单,还以为freeCAD不支持这个功能,后来才发现是没有找对 ...

  5. 【Python_PyQtGraph 学习笔记(五)】基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息

    基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息 前言 基于PySide2.PyQtGraph和GraphicsLayoutWidget动态绘 ...

  6. 【Python_PyQtGraph 学习笔记(六)】基于GraphicsLayoutWidget 实现 曲线对象PlotDataItem 隐藏功能

    基于GraphicsLayoutWidget 实现 曲线对象PlotDataItem 隐藏功能 前言 通过GraphicsLayoutWidget 可以绘制多条曲线.如果绘制多条曲线后,既想保存多条曲 ...

  7. Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作

    Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...

  8. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  9. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

最新文章

  1. linux free命令详解和使用实例(查看内存使用率)
  2. acm pc^2的配置与使用
  3. 1.网页学习-开始学习第一步:
  4. C++ string字符串比较问题
  5. 3288 android5.1 编译,RK3288編譯 Android 5.1 固件
  6. Hdu 1072 【广搜】.cpp
  7. labelimg如何调整框的颜色_如何制作摄影集(下)
  8. 启动kafka报错:__consumer_offsets-22\00000000000000000000.index.swap: 另一个程序正在使用此文件,进程无法访问。
  9. 企业办公oa系统医药OA办公后台管理会议管理用户管理物料管理活动管理/Axure医药内部管理平台/web端后台管理系统原型/医药OA系统/权限管理
  10. 关于React的一切(updating...)
  11. python中不同类型的数据不能相互运算_python语法入门(数据类型、运算)
  12. SCUT - 12 - 西方国家 - 矩阵快速幂
  13. Qt 之 HTTP 请求下载(支持断点续传)
  14. 2020数学建模国赛A题 炉温曲线 心得
  15. 诺基亚E71 专用UCWEB 6.7
  16. 计算机无法识别打印机usb,USB无法识别打印机的解决方案和教程
  17. 计算机设置成一个网络,怎样将笔记本电脑设置成一个wifi热点
  18. eleme项目框架搭建及eslint常见报错(含图标字体库说明)
  19. CSR-I (WSJ0) Complete又名wsj0数据集
  20. 全球及中国冻干菠萝行业市场运行模式及未来发展前景分析报告2022-2028年

热门文章

  1. 【好用的工具】视频剪辑工具
  2. 百度地图3D地球闪动点(修复不在视野内时无法隐藏marker的bug)
  3. pandas的引用与复制
  4. html引入scss,使用Sass混合宏来声明CSS伪类选择器
  5. mysql 约束0怎么设计_java mysql约束与设计
  6. Android电话相关的操作 - 打电话,接电话,挂电话
  7. php hover,让hover
  8. 关于项目中Spring版本与jdk1.8兼容问题解决
  9. 解决移动端点击屏幕变蓝的问题
  10. 纯JS导入导出文件(XLSX)