You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6:获取鼠标相对于QLabel中图片的坐标实现问题

解决方法

你的问题核心是信号未携带坐标参数,且错误绑定了主窗口的事件函数。按以下步骤修改即可:

1. 修正ImLabel的信号定义与发射

首先要让信号能传递鼠标的x、y坐标,同时在鼠标移动事件中主动发射信号:

from PyQt5.QtWidgets import QLabel
from PyQt5.QtCore import Signal

class ImLabel(QLabel):
    # 定义可传递两个整数参数的信号
    on_mouse_move = Signal(int, int)

    def __init__(self):
        super().__init__()
        # 启用鼠标追踪,否则只有按住鼠标时才会触发mouseMoveEvent
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        # 发射信号,传递当前鼠标相对于图片的坐标
        self.on_mouse_move.emit(event.x(), event.y())
        # 调用父类事件处理,保证原有功能正常
        super().mouseMoveEvent(event)

2. 修正MainWindow的槽函数绑定

不要复用主窗口的mouseMoveEvent(这是主窗口自身的事件处理逻辑,会和子控件信号冲突),写一个专门的方法接收坐标并更新显示:

from PyQt5.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.source_image = ImLabel()
        # 将子控件信号绑定到自定义槽函数
        self.source_image.on_mouse_move.connect(self.update_cursor_coords)
        
        self.cursor = QLabel("cursor : ")
        # 基础布局示例,确保控件正常显示
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.source_image)
        layout.addWidget(self.cursor)
        self.setCentralWidget(central_widget)

    # 自定义槽函数,接收x、y坐标参数
    def update_cursor_coords(self, x, y):
        self.cursor.setText(f'Mouse coords: ( {x} : {y} )')

关键注意点

  • 必须给ImLabel设置setMouseTracking(True),否则只有按住鼠标拖动时才会触发mouseMoveEvent,普通移动不会响应
  • 信号要明确参数类型,才能正确传递坐标值
  • 主窗口避免用自身事件函数作为槽函数,专门写处理坐标更新的方法更清晰,也不会混淆事件逻辑

内容的提问来源于stack exchange,提问作者Sylvain Page

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:48:38