Отслеживание мыши PyQt5 над объектом QLabel - PullRequest
3 голосов
/ 26 января 2020

Я использую PyQt5 для создания приложения. В приложении есть MainWindow с несколькими виджетами. Одним из виджетов является объект QLabel, который отображает видео. Я хочу отслеживать курсор и отображать координаты курсора при наведении курсора мыши на видео при проверке переключателя.

Я создал класс MouseTracking, в который я передаю объект QLabel как window. Я проверил, что передается в класс, печатая его геометрию. Но я почему-то не связываю отслеживание мыши с window. Вот код для класса MouseTracking. Что я делаю не так?

class MouseTracker(QLabel):
    def __init__(self, window):
        super().__init__(window)
        self.window = window
        self.window.setMouseTracking(True)
        self.initUI()

    def initUI(self):
        self.label = QLabel(self)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setStyleSheet('background-color: white; border: 1px solid black')
        self.show()

    def mouseMoveEvent(self, event):
        x = event.x()
        y = event.y()
        print("X, Y = ", x, y)
        self.label.setGeometry(x+30, y-15, 90, 40)
        self.label.setText('(%d, %d)' % (x, y))

1 Ответ

3 голосов
/ 26 января 2020

В вашем коде вы включили свойство mouseTracking «окна», но вы отслеживаете неправильный метод mouseMoveEvent в MouseTracker. Если вы хотите отслеживать события виджета без переопределения какого-либо метода, вы должны использовать фильтр событий.

В следующем примере я пытаюсь реализовать ваше приложение на основе вашего описания, например, зеленый QLabel представляет QLabel, который показывает видео. Учитывая вышеизложенное, решение выглядит следующим образом:

from PyQt5 import QtCore, QtGui, QtWidgets


class MouseTracker(QtCore.QObject):
    positionChanged = QtCore.pyqtSignal(QtCore.QPoint)

    def __init__(self, widget):
        super().__init__(widget)
        self._widget = widget
        self.widget.setMouseTracking(True)
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, o, e):
        if o is self.widget and e.type() == QtCore.QEvent.MouseMove:
            self.positionChanged.emit(e.pos())
        return super().eventFilter(o, e)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        self.video_label = QtWidgets.QLabel()
        self.video_label.setStyleSheet("background-color: green; border: 1px solid black")

        tracker = MouseTracker(self.video_label)
        tracker.positionChanged.connect(self.on_positionChanged)

        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.video_label)
        lay.addWidget(QtWidgets.QLabel())

        self.resize(640, 480)

        self.label_position = QtWidgets.QLabel(
            self.video_label, alignment=QtCore.Qt.AlignCenter
        )
        self.label_position.setStyleSheet('background-color: white; border: 1px solid black')

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_positionChanged(self, pos):
        delta = QtCore.QPoint(30, -15)
        self.label_position.show()
        self.label_position.move(pos + delta)
        self.label_position.setText("(%d, %d)" % (pos.x(), pos.y()))
        self.label_position.adjustSize()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...