PyQt5子类QDicomLabel_contrast无法触发MouseMoveEvent求助
解决PyQt5中QLabel子类mouseMoveEvent无法触发的问题
我最近碰到个头疼的问题:自己写了个继承QLabel的子类QDicomLabel_contrast,把它放到QWidget里之后,mouseMoveEvent怎么都触发不了。我的代码如下:
from PyQt5.QtWidgets import * import sys class QDicomLabel_contrast(QLabel): def __init__(self,parent=None): super(QDicomLabel_contrast,self).__init__(parent) self.setStyleSheet("background-color:black") self.setMouseTracking(True) def mouseMoveEvent(self, QMouseEvent): pos = QMouseEvent.pos() print(pos.x(), pos.y()) if __name__ == '__main__': app = QApplication(sys.argv) widget = QWidget() label = QDicomLabel_contrast(widget) label.resize(400, 300) widget.show() sys.exit(app.exec_())
问题原因
这个问题核心在于父QWidget默认没有开启鼠标追踪:当鼠标在QWidget区域内移动时,父控件会直接拦截鼠标移动事件,不会将事件传递给子控件QLabel。哪怕子类自己已经开启了setMouseTracking(True),也没法收到事件回调。
解决办法
只需要给父QWidget也开启鼠标追踪,同时优化事件重写的可读性即可:
- 给父控件添加
setMouseTracking(True),让它把鼠标移动事件传递给子控件 - (可选)把
mouseMoveEvent的参数名改成更规范的event(PyQt对参数名不强制,但这样代码可读性更好)
修改后的完整代码如下:
from PyQt5.QtWidgets import * import sys class QDicomLabel_contrast(QLabel): def __init__(self,parent=None): super(QDicomLabel_contrast,self).__init__(parent) self.setStyleSheet("background-color:black") self.setMouseTracking(True) def mouseMoveEvent(self, event): pos = event.pos() print(pos.x(), pos.y()) if __name__ == '__main__': app = QApplication(sys.argv) widget = QWidget() # 给父QWidget开启鼠标追踪 widget.setMouseTracking(True) label = QDicomLabel_contrast(widget) label.resize(400, 300) widget.resize(400, 300) widget.show() sys.exit(app.exec_())
另外还要注意:如果父控件上还有其他子控件,要确保QDicomLabel_contrast没有被这些控件遮挡,否则鼠标事件会被遮挡的控件优先接收。
内容的提问来源于stack exchange,提问作者Qiang Zhang
相关产品推荐
相关产品推荐

