如何在mouse wheelEvent中获取pyqtgraph plotwidget的objectName?

问题描述 投票:1回答:1

我正在尝试确定鼠标滑过的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_())
python pyqt5 mouseevent mousewheel pyqtgraph
1个回答
1
投票

PlotWidget实际上是QAbstractScrollArea的子类,QAbstractScrollArea是一个复杂的窗口小部件,至少包含三个子窗口小部件:滚动条(即使它们被隐藏),最重要的是viewport,它实际上是“内容”。

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

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

[从父窗口小部件截取事件时要特别小心,尤其是对于像滚动区域这样复杂的窗口小部件:由于孩子可能会将它们accept阻止,因此不能保证会收到它们,因为这会阻止进一步传播到其父窗口。] >

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

    self.graph.viewport().installEventFilter(self)
© www.soinside.com 2019 - 2024. All rights reserved.