草庐IT

【Python_PyQtGraph 学习笔记(三)】基于GraphicsLayoutWidget实现显示曲线对象 鼠标位置处坐标的功能

禾戊之昂 2023-05-18 原文

基于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 somewrong
          others:
        """
        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-1
                self.humPoint.setPos(mousePoint.x() / (self.__m_curvePtr - 1))  # Point设置位置的float类型范围是0-1
                self.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. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

随机推荐