我有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绘图的功能(它应该正常捕获所有鼠标事件)]
[如果有更好的策略,请提出建议
PyQtGraph does在sigMouseClicked
类中实现了GraphicsScene
信号,但是以某种方式未记录。 GraphicsScene page仅说明了为什么它实现了并行鼠标事件系统,但是如果查看the source,您会发现它也发出一些方便的信号。
由于这些都是无证件,因此您应自行承担使用风险!也许将来它们会发生变化,尽管我认为这不太可能。或者,您可以提出一个问题,并要求他们得到正式支持。
该信号具有原始鼠标事件作为参数。没有对单击的图的引用,但是如果您可以通过覆盖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_())