如何在鼠标滚轮事件期间获取 pyqtgraph plotwidget 的对象名称?
How to get objectName of a pyqtgraph plotwidget during a mouse wheelEvent?
我正在尝试识别鼠标在其上滚动的 pyqtgraph plotwidget 的对象名称。但是,我似乎只能得到对象id "PyQt5.QtWidgets.QWidget object at 0x0000018ED2ED74C8"。如果我使用 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 的子类,QAbstractScrollArea 是一个复杂的小部件,至少具有三个 children 小部件:滚动条(即使它们是隐藏的),最重要的是,viewport,其实就是滚动区的"content"。
这意味着使用 widgetAt()
您得到的不是绘图小部件(滚动区域),而是它的视口。事实上,在您的情况下,您可以通过检查 parent:
来获取绘图小部件
def wheelEvent(self, event):
hoveredWidget = QApplication.widgetAt(event.globalPos())
if hoveredWidget and hoveredWidget.parent():
print(hoveredWidget.parent().objectName())
从 parent 小部件拦截事件时要小心,特别是对于像滚动区域这样复杂的小部件:不能保证您会收到它们,因为 children 可以 accept他们,防止进一步传播到他们的 parent(s).
如果您需要对它们进行更多控制,通常最好在它们的子类中实现各自的方法或在实例上安装 event filter。
请注意,由于上述原因,如果您想在滚动区域过滤事件,您可能更愿意在视口上安装过滤器:
self.graph.viewport().installEventFilter(self)
我正在尝试识别鼠标在其上滚动的 pyqtgraph plotwidget 的对象名称。但是,我似乎只能得到对象id "PyQt5.QtWidgets.QWidget object at 0x0000018ED2ED74C8"。如果我使用 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 的子类,QAbstractScrollArea 是一个复杂的小部件,至少具有三个 children 小部件:滚动条(即使它们是隐藏的),最重要的是,viewport,其实就是滚动区的"content"。
这意味着使用 widgetAt()
您得到的不是绘图小部件(滚动区域),而是它的视口。事实上,在您的情况下,您可以通过检查 parent:
def wheelEvent(self, event):
hoveredWidget = QApplication.widgetAt(event.globalPos())
if hoveredWidget and hoveredWidget.parent():
print(hoveredWidget.parent().objectName())
从 parent 小部件拦截事件时要小心,特别是对于像滚动区域这样复杂的小部件:不能保证您会收到它们,因为 children 可以 accept他们,防止进一步传播到他们的 parent(s).
如果您需要对它们进行更多控制,通常最好在它们的子类中实现各自的方法或在实例上安装 event filter。
请注意,由于上述原因,如果您想在滚动区域过滤事件,您可能更愿意在视口上安装过滤器:
self.graph.viewport().installEventFilter(self)