You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQtGraph绘图中sigPointsHovered信号无法触发的问题求助

解决PyQtGraph中sigPointsHovered信号无法触发的问题

我帮你排查了代码里的问题,主要有几个关键细节没处理到位,导致sigPointsHovered信号无法触发,下面一步步给你说明:

问题根源分析

  1. 默认无可见交互点:你用plot_item.plot(x,y)创建的是PlotDataItem,它默认只绘制线条,不会显示散点——而sigPointsHovered是针对散点元素的信号,没有可hover的点自然不会触发。
  2. 函数参数不匹配:你定义的hovered函数带了self参数,但这个函数并不是类的方法,信号传递的参数(points和ev)和函数期望的参数不匹配,会导致信号无法正确绑定执行。
  3. 未明确启用hover功能:即使后来设置了hovered=True,如果没有可见的散点,这个设置也不会生效。

修正后的完整代码

from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout
import pyqtgraph as pg

# 修正:移除多余的self参数,匹配信号传递的参数
def hovered(points, ev):
    print("FOOO")
    # 可选:打印悬停点的具体坐标
    for point in points:
        print(f"悬停点坐标:x={point.x()}, y={point.y()}")

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()

# 关键:创建PlotDataItem时,指定散点样式并启用hover
line = plot_item.plot(
    x, y,
    symbol='o',          # 必须设置散点符号,让点可见
    hoverable=True,      # 启用悬停检测
    pen=pg.mkPen(color='blue', width=2),  # 设置线条样式
    brush=pg.mkBrush(color='blue')        # 设置散点填充颜色
)

line.sigPointsHovered.connect(hovered)

layout.addWidget(plot_widget)
window.setLayout(layout)
window.show()
app.exec_()

另一种更灵活的实现方式

如果你想把线条和散点分开控制,可以分别创建LinePlotItem和ScatterPlotItem,直接给散点绑定信号:

from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout
import pyqtgraph as pg

def hovered(points, ev):
    print("FOOO")
    for point in points:
        print(f"悬停点坐标:x={point.x()}, y={point.y()}")

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_item = pg.PlotDataItem(x, y, pen=pg.mkPen('blue', width=2))
scatter_item = pg.ScatterPlotItem(
    x, y,
    symbol='o',
    hoverable=True,
    brush=pg.mkBrush('blue')
)

# 给散点绑定悬停信号
scatter_item.sigPointsHovered.connect(hovered)

plot_item.addItem(line_item)
plot_item.addItem(scatter_item)

layout.addWidget(plot_widget)
window.setLayout(layout)
window.show()
app.exec_()

核心注意事项

  • 必须通过symbol参数指定散点样式,让交互点可见;
  • 确保hoverable=True已明确设置;
  • 信号处理函数的参数要和信号传递的参数匹配(sigPointsHovered传递points和ev两个参数,不要多余的self)。

内容的提问来源于stack exchange,提问作者Lisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:17:33