如何在鼠标滚轮事件期间获取pyqtgraph plotwidget的objectName?

2024-06-26 14:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试识别鼠标移动的pyqtgraph plotwidget的对象名。但是,我似乎只能在0x0000018ED2ED74C8处获取对象id“PyQt5.qtwidts.QWidget对象”。如果我使用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_())

Tags: 对象importselfeventsyspyqt5graphpyqtgraph
1条回答
网友
1楼 · 发布于 2024-06-26 14:24:29

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

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

    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)

相关问题 更多 >