我正在嘗試識別我正在滾動鼠標的 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
提交
取消