Как подключить сигнал щелчка мышью к графическому элементу pyqtgraph - PullRequest
0 голосов
/ 23 октября 2019

У меня есть приложение Qt, где я рисую графики, используя pyqtgraph lib, и использую док-контейнеры также из pyqtgraph. Поэтому я создаю несколько док-контейнеров и помещаю по одному графику в каждый. Затем в моем коде мне нужно идентифицировать график, с которым пользователь работает, чтобы обновить некоторые другие сотрудники в приложении (например, чтобы показать некоторые свойства для «активного» графика в некоторых общих для всех виджетов).

Моя идея состоит в том, чтобы получить сигнал щелчка мыши и определить график, на котором он был нажат, чтобы узнать, с каким последним пользователем взаимодействовал график. Но классы pyqtgraph PlotWidget, PlotItem или ViewBox не предоставляют таких сигналов, и я не знаю, есть ли способ реализовать это самостоятельно. Кроме того, я не нашел способа определить, какой док-контейнер активен. Я вижу только sigMouseReleased для PlotWidget, но даже это не работает для меня (см. Код ниже)

Вот мой минимальный код:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import pyqtgraph as pg
from pyqtgraph.dockarea import *

# I use Qt Designer, below I just cut generated code to minimum
class Ui_StartForm(object):
    def setupUi(self, StartForm):
        StartForm.setObjectName("StartForm")
        StartForm.resize(1507, 968)
        self.GraphLayout = QtWidgets.QGridLayout(StartForm)

# my application
class AppWindow(QtWidgets.QWidget, Ui_StartForm):
    def __init__(self):
        super(AppWindow, self).__init__()
        self.setupUi(self)

        self.dock_area_main = DockArea()
        self.GraphLayout.addWidget(self.dock_area_main)

        self.Dock1 = Dock("Dock 1", size=(1, 1))
        self.dock_area_main.addDock(self.Dock1, 'left')

        self.Dock2 = Dock("Dock 2", size=(1, 1))
        self.dock_area_main.addDock(self.Dock2, 'right')

        self.GraphViewList = []

        self.pl1 = pg.PlotWidget()
        self.pl2 = pg.PlotWidget()

        self.Dock1.addWidget(self.pl1)
        self.Dock2.addWidget(self.pl2)

        self.pl1.sigMouseReleased.connect(self.mouse_release) # try to get some mouse event

    def mouse_release(self):
        print('click')   # never execute


app = QtWidgets.QApplication(sys.argv)
w = AppWindow()
w.show()
sys.exit(app.exec_())

Мой вопрос: как я могу реализовать сигналщелкнув мышью для pyqtgraph PlotItem или ViewBox, чтобы определить, какой граф последний раз взаимодействовал с пользователем. В то же время, он не должен влиять на функции графиков pyqtgraph (он должен нормально отлавливать все события мыши)

Если есть лучшая стратегия для этого - предложите

1 Ответ

1 голос
/ 24 октября 2019

PyQtGraph реализует сигнал sigMouseClicked в классе GraphicsScene, но это почему-то недокументировано. Страница GraphicsScene объясняет только, почему она реализует систему событий параллельной мыши, но если вы посмотрите на источник , вы увидите, что он также излучает несколько полезных сигналов.

Поскольку они недокументированы, вы должны использовать их на свой страх и риск! Возможно, они изменятся в будущем, хотя я думаю, что это маловероятно. Или, может быть, вы можете открыть вопрос и попросить, чтобы он был официально поддержан.

В качестве параметра у сигнала есть исходное событие мыши. Нет ссылки на график, по которому щелкнули, но если вы можете решить эту проблему, переопределив pg.PlotWidget и подключившись к слоту этого производного класса. Вот так ...

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import pyqtgraph as pg
from pyqtgraph.dockarea import *

# I use Qt Designer, below I just cut generated code to minimum
class Ui_StartForm(object):
    def setupUi(self, StartForm):
        StartForm.setObjectName("StartForm")
        StartForm.resize(1507, 968)
        self.GraphLayout = QtWidgets.QGridLayout(StartForm)


class MyPlotWidget(pg.PlotWidget):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        # self.scene() is a pyqtgraph.GraphicsScene.GraphicsScene.GraphicsScene
        self.scene().sigMouseClicked.connect(self.mouse_clicked)    


    def mouse_clicked(self, mouseClickEvent):
        # mouseClickEvent is a pyqtgraph.GraphicsScene.mouseEvents.MouseClickEvent
        print('clicked plot 0x{:x}, event: {}'.format(id(self), mouseClickEvent))



# my application
class AppWindow(QtWidgets.QWidget, Ui_StartForm):
    def __init__(self):
        super(AppWindow, self).__init__()
        self.setupUi(self)

        self.dock_area_main = DockArea()
        self.GraphLayout.addWidget(self.dock_area_main)

        # Best to use lower case for variables and upper case for types, so I
        # renamed self.Dock1 to self.dock1.        

        self.dock1 = Dock("Dock 1", size=(1, 1)) 
        self.dock_area_main.addDock(self.dock1, 'left')

        self.dock2 = Dock("Dock 2", size=(1, 1))
        self.dock_area_main.addDock(self.dock2, 'right')

        self.GraphViewList = []

        self.pl1 = MyPlotWidget()
        self.pl2 = MyPlotWidget()

        self.dock1.addWidget(self.pl1)
        self.dock2.addWidget(self.pl2)



app = QtWidgets.QApplication(sys.argv)
w = AppWindow()
w.show()
sys.exit(app.exec_())
...