如何在鼠标滚轮事件中获取pyqtgraph绘图小部件的objectName



我正在尝试识别鼠标滚动的pyqtgraph绘图小部件的对象名称。然而,我似乎只能获得对象id"PyQt5.QtWidgets.QWidget object at 0x0000018ED2D74C8"。如果我使用QApplication.widgetAt(event.globalPos(((.objectName,即使我设置了对象名称,我也不会得到任何结果。你能帮我吗?

样本代码:

# Import packages
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout
import pyqtgraph as pg
import sys
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.graphLayout = QHBoxLayout()
self.graph = pg.PlotWidget(name="graph1")
self.graph.setObjectName("graph1")
self.graphLayout.addWidget(self.graph)
self.setLayout(self.graphLayout)
def wheelEvent(self, event):
hoveredWidget = QApplication.widgetAt(event.globalPos())
print(hoveredWidget.objectName())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
PlotWidget实际上是QAbstractScrollArea的一个子类,这是一个复杂的小部件,至少有三个子部件:滚动条(即使它们被隐藏(,最重要的是,视口,它实际上是滚动区域的"内容"。

这意味着使用widgetAt(),您获得的不是绘图小部件(滚动区域(,而是它的视口。事实上,在您的情况下,您可以通过检查父项来获得绘图小部件:

def wheelEvent(self, event):
hoveredWidget = QApplication.widgetAt(event.globalPos())
if hoveredWidget and hoveredWidget.parent():
print(hoveredWidget.parent().objectName())

从父窗口小部件截取事件时要小心,尤其是对于像滚动区域这样复杂的窗口小部件:不能保证您会收到它们,因为子窗口小部件可以接受它们,从而防止进一步传播到其父窗口小部件。

如果您需要对它们进行更多的控制,通常最好在它们的子类中实现相应的方法,或者在实例上安装事件过滤器
请注意,由于上述原因,如果您想在滚动区域上过滤事件,您可能更喜欢在视口上安装过滤器:

self.graph.viewport().installEventFilter(self)

最新更新