Как получить objectName для pywtgraph plotwidget во время события мыши? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь определить имя объекта для pyttgraph plotwidget, по которому я вращаю мышь. Тем не менее, я могу только получить идентификатор объекта "PyQt5.QtWidgets.QWidget объект в 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_())

1 Ответ

1 голос
/ 22 апреля 2020

PlotWidget на самом деле является подклассом QAbstractScrollArea, который является сложным виджетом, который имеет как минимум три дочерних виджета: полосы прокрутки (даже если они скрыты) и, что наиболее важно, область просмотра , который на самом деле является «содержимым» области прокрутки.

Это означает, что при использовании widgetAt() вы получаете не виджет графика (область прокрутки), а его окно просмотра. Фактически, в вашем случае вы можете получить виджет графика, проверив родителя:

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

Будьте осторожны при перехвате событий из родительского виджета, особенно для такого сложного виджета, как области прокрутки: это не гарантирует, что вы получит их, так как дети могут принять их, что предотвратит дальнейшее распространение их родителей.

Если вам нужен больший контроль над ними, обычно лучше реализовать соответствующие методы в их подклассы или установка фильтра событий на экземплярах.
Обратите внимание, что по вышеуказанной причине, если вы хотите фильтровать события в области прокрутки, вы можете установить фильтр в области просмотра:

    self.graph.viewport().installEventFilter(self)
...