首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyqtgraph中的十字准线类

Pyqtgraph中的十字准线类
EN

Stack Overflow用户
提问于 2014-04-04 01:24:34
回答 1查看 1.9K关注 0票数 0

我想定义一个名为Crosshair的类,它可以附加到pyqtgraph中的绘图上。我在示例中找到了以下代码片段:

代码语言:javascript
复制
#cross hair
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
p1.addItem(vLine, ignoreBounds=True)
p1.addItem(hLine, ignoreBounds=True)


vb = p1.vb

def mouseMoved(evt):
    pos = evt[0]  ## using signal proxy turns original arguments into a tuple
    if p1.sceneBoundingRect().contains(pos):
        mousePoint = vb.mapSceneToView(pos)
        index = int(mousePoint.x())
        if index > 0 and index < len(data1):
            label.setText("<span style='font-size: 12pt'>x=%0.1f,   <span style='color: red'>y1=%0.1f</span>,   <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index], data2[index]))
        vLine.setPos(mousePoint.x())
        hLine.setPos(mousePoint.y())

proxy = pg.SignalProxy(p1.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)

我开始将它转换为一个类,如下所示:

代码语言:javascript
复制
class CrossHair():
    def __init__(self, p1):
        self.vLine = pg.InfiniteLine(angle=90, movable=False)
        self.hLine = pg.InfiniteLine(angle=0, movable=False)
        self.p1 = p1
        self.vb = self.p1.vb
        p1.addItem(self.vLine, ignoreBounds=True)
        p1.addItem(self.hLine, ignoreBounds=True)
        self.proxy = pg.SignalProxy(self.p1.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)

    def mouseMoved(self, evt):
        pos = evt[0]  ## using signal proxy turns original arguments into a tuple
        if self.p1.sceneBoundingRect().contains(pos):
            mousePoint = self.vb.mapSceneToView(pos)
            index = int(mousePoint.x())
            # if index > 0 and index < len(data1):
            #     label.setText("<span style='font-size: 12pt'>x=%0.1f,   <span style='color: red'>y1=%0.1f</span>,   <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index], data2[index]))
            self.vLine.setPos(mousePoint.x())
            self.hLine.setPos(mousePoint.y())

ch = CrossHair(p1)

这是正确的做法吗?换句话说,我是否做了正确的事情,将情节附加到十字准线上?我本来想做相反的事情,但我不确定该怎么做,也不知道这样做是否正确。

另外,如何从绘图本身检索数据值(已注释的部品)?

EN

Stack Overflow用户

发布于 2014-04-04 03:44:20

一种更好的方法是创建pg.GraphicsObject的子类,其中包含两个InfiniteLines作为子类。参考:QtGui.QGraphicsItempg.GraphicsItem,也参见customGraphicsItem示例。

该类应该有一个setPos()方法来设置十字准线原点的位置。然后,您可以添加一些应用程序级别的代码来跟踪鼠标位置并相应地更新十字准线,如十字准线示例所示。或者,您可以让十字准线本身自动跟踪鼠标位置。

关于第二个问题:您至少需要告诉CrossHair它应该询问哪个(S)PlotDataItem或PlotCurveItem(s),以确定与垂直线相交的y位置。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22844768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档