es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

pyqtgraph cómo obtener correctamente la posición del clic del mouse

Preparé una función correcta onMouseMoved que muestra correctamente las coordenadas de mi mouse, pero cuando hago clic en algún lugar, Python imprime las coordenadas de mi ventana en lugar de mi gráfico. Intenté hacerlo de la misma manera que para onMouseMoved pero no funciona. También intenté usar mouseClickEvent.scenePos() en lugar de mouseClickEvent pero tampoco funciona.

import sys
from PyQt5 import QtWidgets
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, args, *kwargs):
        super(MainWindow, self).__init__(args, *kwargs)

        self.graphWidget = pg.PlotWidget()
        self.setCentralWidget(self.graphWidget)

        hour = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]

        self.graphWidget.plot(hour, temperature)

        self.label = pg.TextItem(text="X: {} \nY: {}".format(0, 0))
        self.graphWidget.addItem(self.label)

        self.setMouseTracking(True)
        self.graphWidget.scene().sigMouseMoved.connect(self.onMouseMoved)
        self.graphWidget.scene().sigMouseClicked.connect(self.mouse_clicked)

    def onMouseMoved(self, evt):
        if self.graphWidget.plotItem.vb.mapSceneToView(evt):
            point = self.graphWidget.plotItem.vb.mapSceneToView(evt)
            self.label.setHtml(
                "<p style='color:white'>X: {0} <br> Y: {1}</p>".format(point.x(), point.y()))

    def mouse_clicked(self, mouseClickEvent):
        # mouseClickEvent is a pyqtgraph.GraphicsScene.mouseEvents.MouseClickEvent
        print('Hizo clic en el gráfico 0x{:x}, evento: {}'.format(id(self), mouseClickEvent))

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

if name == 'main':
    main()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la función actual mouse_clicked es que solo imprime mouseClickEvent, que contiene información sobre el evento de clic del mouse pero no su posición en el gráfico. Para imprimir las coordenadas del clic del mouse en el gráfico, necesitamos usar la función mapFromScene para convertir las coordenadas de la escena a coordenadas del gráfico.

    Aquí está la función mouse_clicked actualizada que debería funcionar:

    def mouse_clicked(self, mouseClickEvent):
        # mouseClickEvent es un pyqtgraph.GraphicsScene.mouseEvents.MouseClickEvent
        if self.graphWidget.plotItem.vb.sceneBoundingRect().contains(mouseClickEvent.scenePos()):
            # Obtener la posición del clic del mouse en coordenadas del gráfico
            point = self.graphWidget.plotItem.vb.mapSceneToView(mouseClickEvent.scenePos())
            print('clic en el gráfico 0x{:x}, x={}, y={}'.format(id(self), point.x(), point.y()))
    

    Primero verificamos si la posición del clic del mouse está dentro del rectángulo delimitador del gráfico, luego usamos mapSceneToView para obtener las coordenadas del gráfico del clic del mouse. Finalmente, imprimimos estas coordenadas junto con un mensaje que indica el gráfico en el que se hizo clic.

Comments are closed.