pytqt图线的鼠标坐标 [英] Mouse coordinates of pytqt graph line

查看:103
本文介绍了pytqt图线的鼠标坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我将鼠标移动到图形顶部时,我都会尝试获取随机函数图的 (x,y) 值.我正在使用 pyqtgraph.SignalProxy 并将其连接到回调 mousedMoved.

I am trying to get the (x,y) values of my random function plot whenever I move the moused on top of the graph. I am using pyqtgraph.SignalProxy and connect it to a callback mousedMoved.

我收到此错误:NameError:未定义全局名称mouseMoved"

I am getting this as error: NameError: global name 'mouseMoved' is not defined

代码如下:

import sys
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import time
import random

class TestClass(QtGui.QMainWindow):
  #####################################################
  def __init__(self):
    super(TestClass, self).__init__()
    self.initUI()

  #####################################################
  # GUI construction
  def initUI(self):
    win = pg.GraphicsWindow(title="Mouse Point, x & y")

    # creates plot
    self.plot = pg.PlotWidget()
    self.plot.setLabel('left', "B", units='T')
    self.plot.setLabel('bottom', "t", units='s')
    self.plot.showGrid(x=1, y=1, alpha=None)
    self.setCentralWidget(win)
    self.setGeometry(600, 600, 600, 600)
    self.setWindowTitle('Mouse Point, x& y GUI')

    # Create some widgets to be placed inside
    btnRandon = QtGui.QPushButton('Random Function')


    # Create a grid layout to manage the widgets size and position
    layout = QtGui.QGridLayout()
    win.setLayout(layout)

    # Add widgets to the layout in their proper positions
    layout.addWidget(btnRandon, 0, 0) # button to show or hide the OldB
    layout.addWidget(self.plot, 1, 0)

    mypen = pg.mkPen('y', width=1)
    self.curve = self.plot.plot(pen=mypen)

    # Plot
    self.t_plot_max = 30
    self.fe = 10e3
    self.t = np.arange(-1 * self.t_plot_max, 0, 1.0 / self.fe)
    self.len_signal = len(self.t)
    self.signal = np.zeros(self.len_signal, dtype=np.double)

    # status bar
    self.statusBar()

    # clicked button evt
    btnRandon.clicked.connect(self.buttonRandomClicked)

    # show graph
    self.show()

  #####################################################
  def mouseMoved(evt):
    mousePoint = self.curve.vb.mapSceneToView(evt[0])
    label.setText("<span style='font-size: 14pt; color: white'> x = %0.2f, <span style='color: white'> y = %0.2f</span>" % (mousePoint.x(), mousePoint.y()))


  #####################################################
  def buttonRandomClicked(self):
    print ("Show/Hide OldB")
    self.signal = np.random.rand(20)
    self.curve.setData(self.signal)

#####################################################
  def update(self):
    proxy = pg.SignalProxy(self.curve.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
    self.statusBar().showMessage('Update timer event')

# MAIN ##################################################
def main():
  app = QtGui.QApplication(sys.argv)
  ex = TestClass()
  timer = QtCore.QTimer()
  timer.timeout.connect(ex.update)
  timer.start(200)
  sys.exit(app.exec_())


if __name__ == '__main__':
  main()

我知道我做错了什么吗?

Amy idea what I'm doing wrong?

谢谢.

推荐答案

不必使用 QTimer 来执行此任务并创建名为 update() 的方法code> 因为 QMainWindow 有一个类似的方法,可能会干扰正确的操作.

It is not necessary to use a QTimer to perform this task and to create a method called update() since QMainWindow has a similar method and could be interfering with the correct operation.

每次移动鼠标时都会发出 sigMouseMoved 信号,因此通常不需要使用 SignalProxy.

The sigMouseMoved signal is emitted every time you move the mouse, so in general it is not necessary to use the SignalProxy.

信号 sigMouseMoved 返回相对于 PlotWidget 的像素坐标,而不是绘图的坐标,因此必须使用 进行转换ViewBox--> PlotItem --> PlotWidget.

The signal sigMouseMoved returns the coordinates in pixels with respect to the PlotWidget, not in the coordinates of the plot, so a conversion must be done using the mapSceneToView method of the ViewBox--> PlotItem --> PlotWidget.

最后,没有必要使用GraphicsWindow(),这会创建另一个窗口,只需一个QWidget就足够了.

Finally, it is not necessary to use GraphicsWindow(), this creates another window, just a QWidget is enough.

import sys
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import random

class TestClass(QtGui.QMainWindow):
    #####################################################
    def __init__(self):
        super(TestClass, self).__init__()
        self.initUI()
    ####################################################
    # GUI construction
    def initUI(self):
        self.setWindowTitle("Mouse Point, x & y")
        win = QtGui.QWidget()
        # creates plot
        self.plot = pg.PlotWidget()
        self.plot.setLabel('left', "B", units='T')
        self.plot.setLabel('bottom', "t", units='s')
        self.plot.showGrid(x=1, y=1, alpha=None)
        self.setCentralWidget(win)
        self.setGeometry(600, 600, 600, 600)
        self.setWindowTitle('Mouse Point, x& y GUI')

        # Create some widgets to be placed inside
        btnRandon = QtGui.QPushButton('Random Function')
        # Create a grid layout to manage the widgets size and position
        layout = QtGui.QGridLayout(win)

        # Add widgets to the layout in their proper positions
        layout.addWidget(btnRandon, 0, 0) # button to show or hide the OldB
        layout.addWidget(self.plot, 1, 0)

        mypen = pg.mkPen('y', width=1)
        self.curve = self.plot.plot(x=[], y=[], pen=mypen)

        # Plot
        self.t_plot_max = 30
        self.fe = 10e3
        self.t = np.arange(-1 * self.t_plot_max, 0, 1.0 / self.fe)
        self.len_signal = len(self.t)
        self.signal = np.zeros(self.len_signal, dtype=np.double)

        btnRandon.clicked.connect(self.buttonRandomClicked)
        self.curve.scene().sigMouseMoved.connect(self.onMouseMoved)

    def onMouseMoved(self, point):
        p = self.plot.plotItem.vb.mapSceneToView(point)
        self.statusBar().showMessage("{}-{}".format(p.x(), p.y()))

    def buttonRandomClicked(self):
        print ("Show/Hide OldB")
        self.signal = np.random.rand(20)
        self.curve.setData(self.signal)


# MAIN ##################################################
def main():
    app = QtGui.QApplication(sys.argv)
    ex = TestClass()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

这篇关于pytqt图线的鼠标坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆