【问题标题】:How to get objectName of a pyqtgraph plotwidget during a mouse wheelEvent?如何在鼠标滚轮事件期间获取 pyqtgraph plotwidget 的 objectName?
【发布时间】:2020-08-05 05:22:27
【问题描述】:

我正在尝试识别我正在滚动鼠标的 pyqtgraph plotwidget 的对象名称。但是,我似乎只能获得对象 id “0x0000018ED2ED74C8 处的 PyQt5.QtWidgets.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_())

【问题讨论】:

    标签: python pyqt5 mouseevent mousewheel pyqtgraph


    【解决方案1】:

    PlotWidget 实际上是 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多