gpt4 book ai didi

python - 如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

转载 作者:行者123 更新时间:2023-12-01 21:54:50 25 4
gpt4 key购买 nike

我有 Qt 应用程序,我在其中使用 pyqtgraph 库绘制图形并使用也来自 pyqtgraph 的停靠容器。所以我创建了几个停靠容器并在每个容器中放了一张图。然后,在我的代码中,我需要识别用户正在使用的图表来更新应用程序中的其他一些员工(例如,在所有小部件的一些公共(public)部分中显示“事件”图表的一些属性)。

我的想法是接收鼠标点击信号并识别点击它的图形以了解用户交互的最后一个图形。但是 pyqtgraph PlotWidget、PlotItem 或 ViewBox 类不提供这样的信号,我不知道是否有办法自己实现。另外,我没有找到一种方法来识别哪个停靠容器处于事件状态。我只看到 PlotWidget 的 sigMouseReleased 但即使这对我也不起作用(见下面的代码)

这是我的最低代码:

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 确实GraphicsScene 类中实现了一个 sigMouseClicked 信号,但不知何故这没有记录。 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_())

关于python - 如何将鼠标点击信号连接到 pyqtgraph 绘图小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com