我正在尝试识别我正在滚动鼠标的 pyqtgraph plotwidget 的对象名称。但是,我似乎只能获得对象 id “0x0000018ED2ED74C8 处的 PyQt5.QtWidgets.QWidget 对象”。如果我使用 QApplication.widgetAt(event.globalPos()).objectName 我什么也得不到,即使我已经设置了对象名称。你能帮助我吗?示例代码:# Import packagesfrom PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayoutimport pyqtgraph as pgimport sysclass 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_())
1 回答
POPMUISE
TA贡献1765条经验 获得超5个赞
PlotWidget 实际上是 QAbstractScrollArea 的子类,它是一个复杂的小部件,它至少具有三个子小部件:滚动条(即使它们被隐藏),最重要的是viewport,它实际上是滚动区域。
这意味着widgetAt()
您使用的不是绘图小部件(滚动区域),而是它的视口。实际上,在您的情况下,您可以通过检查父级来获取绘图小部件:
def wheelEvent(self, event): hoveredWidget = QApplication.widgetAt(event.globalPos()) if hoveredWidget and hoveredWidget.parent(): print(hoveredWidget.parent().objectName())
拦截来自父窗口小部件的事件时要小心,特别是对于像滚动区域这样复杂的窗口小部件:不能保证您会收到它们,因为孩子可以接受它们,从而防止进一步传播到他们的父母。
如果您需要对它们进行更多控制,通常最好在其子类中实现相应的方法或在实例上安装事件过滤器。
请注意,由于上述原因,如果您想过滤滚动区域上的事件,您可能更愿意在视口上安装过滤器:
self.graph.viewport().installEventFilter(self)
添加回答
举报
0/150
提交
取消