Pyqtgraph 中绘图的悬停工具
Hover Tool for plots in Pyqtgraph
我想在 pyqtgraph 图中将鼠标悬停在一条线上时显示数据信息,但无法让我的 sigpointsHovered
发出任何信号。这是我尝试做的一个简单示例:
from PySide6.QtWidgets import QMainWindow, QWidget, QApplication, QVBoxLayout
import pyqtgraph as pg
def hovered(self, points, ev):
print("FOOO")
x = [1,2,3,4,5,6,7,8,9]
y = [0,1,2,3,4,5,6,7,8]
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
plot_widget = pg.PlotWidget()
plot_item = plot_widget.getPlotItem()
line = plot_item.plot(x,y)
line.sigPointsHovered.connect(hovered)
layout.addWidget(plot_widget)
window.setLayout(layout)
window.show()
app.exec_()
我已经尝试设置 "hoverable" = True
并多次阅读文档,但老实说,我不知道为什么 sigPointsHovered
不起作用。
为什么 sigPointsHovered
不起作用
简而言之:目前无法为 PlotDataItem
class 的 ScatterPlotItem
设置“悬停”参数。因此,无法使用 sigPointsHovered
.
您可以在 PlotDataItem
class 的函数 updateItems
.
的源代码中看到这一点
解决方法
如果你现在真的想要 sigPointsHovered
之类的东西,不要使用 PlotWiget
,而是使用 ScatterPlotItem
并在你需要时设置 hoverable = True
初始化它或者当你使用 setData
函数时。 运行 python -m pyqtgraph.examples
并找到散点图示例以查看一些示例代码。
但是,根据您的描述,我认为当您将鼠标悬停在“曲线”(而不是点)上时,您实际上是想做某事。目前,PlotCurveItem
没有实现 hoverEvent
,因此您可以尝试创建一个继承 PlotCurveItem
的 class 并向其添加 hoverEvent
。
让我告诉你如何做到这一点。
本例中,当光标进入曲线时,颜色变为蓝色,离开曲线时变回白色。
import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
class HoverableCurveItem(pg.PlotCurveItem):
sigCurveHovered = QtCore.Signal(object, object)
sigCurveNotHovered = QtCore.Signal(object, object)
def __init__(self, hoverable=True, *args, **kwargs):
super(HoverableCurveItem, self).__init__(*args, **kwargs)
self.hoverable = hoverable
self.setAcceptHoverEvents(True)
def hoverEvent(self, ev):
if self.hoverable:
if self.mouseShape().contains(ev.pos()):
self.sigCurveHovered.emit(self, ev)
else:
self.sigCurveNotHovered.emit(self, ev)
class MainWindow(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.view = pg.GraphicsLayoutWidget()
self.setCentralWidget(self.view)
self.makeplot()
def makeplot(self):
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot = self.view.addPlot()
self.plotitem = HoverableCurveItem(x, y, pen=pg.mkPen('w', width=10))
self.plotitem.setClickable(True, width=10)
self.plotitem.sigCurveHovered.connect(self.hovered)
self.plotitem.sigCurveNotHovered.connect(self.leaveHovered)
plot.addItem(self.plotitem)
def hovered(self):
print("cursor entered curve")
self.plotitem.setPen(pg.mkPen('b', width=10))
def leaveHovered(self):
self.plotitem.setPen(pg.mkPen('w', width=10))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())
编辑
需要setAcceptHoverEvent
到Ture
另外,在更新的示例中,当光标进入曲线时,颜色变为蓝色,离开曲线时变回白色。
我想在 pyqtgraph 图中将鼠标悬停在一条线上时显示数据信息,但无法让我的 sigpointsHovered
发出任何信号。这是我尝试做的一个简单示例:
from PySide6.QtWidgets import QMainWindow, QWidget, QApplication, QVBoxLayout
import pyqtgraph as pg
def hovered(self, points, ev):
print("FOOO")
x = [1,2,3,4,5,6,7,8,9]
y = [0,1,2,3,4,5,6,7,8]
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
plot_widget = pg.PlotWidget()
plot_item = plot_widget.getPlotItem()
line = plot_item.plot(x,y)
line.sigPointsHovered.connect(hovered)
layout.addWidget(plot_widget)
window.setLayout(layout)
window.show()
app.exec_()
我已经尝试设置 "hoverable" = True
并多次阅读文档,但老实说,我不知道为什么 sigPointsHovered
不起作用。
为什么 sigPointsHovered
不起作用
简而言之:目前无法为 PlotDataItem
class 的 ScatterPlotItem
设置“悬停”参数。因此,无法使用 sigPointsHovered
.
您可以在 PlotDataItem
class 的函数 updateItems
.
解决方法
如果你现在真的想要
sigPointsHovered
之类的东西,不要使用PlotWiget
,而是使用ScatterPlotItem
并在你需要时设置hoverable = True
初始化它或者当你使用setData
函数时。 运行python -m pyqtgraph.examples
并找到散点图示例以查看一些示例代码。但是,根据您的描述,我认为当您将鼠标悬停在“曲线”(而不是点)上时,您实际上是想做某事。目前,
PlotCurveItem
没有实现hoverEvent
,因此您可以尝试创建一个继承PlotCurveItem
的 class 并向其添加hoverEvent
。
让我告诉你如何做到这一点。
本例中,当光标进入曲线时,颜色变为蓝色,离开曲线时变回白色。
import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
class HoverableCurveItem(pg.PlotCurveItem):
sigCurveHovered = QtCore.Signal(object, object)
sigCurveNotHovered = QtCore.Signal(object, object)
def __init__(self, hoverable=True, *args, **kwargs):
super(HoverableCurveItem, self).__init__(*args, **kwargs)
self.hoverable = hoverable
self.setAcceptHoverEvents(True)
def hoverEvent(self, ev):
if self.hoverable:
if self.mouseShape().contains(ev.pos()):
self.sigCurveHovered.emit(self, ev)
else:
self.sigCurveNotHovered.emit(self, ev)
class MainWindow(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.view = pg.GraphicsLayoutWidget()
self.setCentralWidget(self.view)
self.makeplot()
def makeplot(self):
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot = self.view.addPlot()
self.plotitem = HoverableCurveItem(x, y, pen=pg.mkPen('w', width=10))
self.plotitem.setClickable(True, width=10)
self.plotitem.sigCurveHovered.connect(self.hovered)
self.plotitem.sigCurveNotHovered.connect(self.leaveHovered)
plot.addItem(self.plotitem)
def hovered(self):
print("cursor entered curve")
self.plotitem.setPen(pg.mkPen('b', width=10))
def leaveHovered(self):
self.plotitem.setPen(pg.mkPen('w', width=10))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())
编辑
需要setAcceptHoverEvent
到Ture
另外,在更新的示例中,当光标进入曲线时,颜色变为蓝色,离开曲线时变回白色。