PyQt5 Mouse Tracking Over QLabel Object
我正在使用PyQt5创建应用程序。 该应用程序具有一个带有多个小部件的MainWindow。 小部件之一是显示视频的QLabel对象。 当我单击单选按钮时,当我将鼠标悬停在视频上时,我想跟踪光标并显示光标坐标。
我创建了一个MouseTracking类,并将QLabel对象作为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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)) |
在您的代码中,启用了"窗口"的mouseTracking属性,但是您正在监视MouseTracker的mouseMoveEvent方法,这是不正确的。 如果要跟踪小部件的事件而不覆盖任何方法,则必须使用事件过滤器。
在以下示例中,我尝试根据您的描述实施您的应用程序,例如绿色的QLabel代表视频显示的QLabel。 考虑到上述情况,解决方案如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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_()) |