Maya中如何实现鼠标悬停时自动选中激活PyQt窗口/UI
Maya PyQt 工具窗口鼠标悬停自动激活方案
核心实现逻辑是通过重写窗口的鼠标进入事件,仅在鼠标移入工具窗口范围时自动激活窗口获取输入焦点,鼠标移走操作Maya主界面时焦点会自然交还给Maya,既不需要手动点击窗口激活快捷键,也不会因为窗口常驻激活状态导致快捷键全局冲突。
实现要点
- 不要使用全局事件过滤器监听鼠标位置,这类写法容易和Maya本身的Qt事件循环冲突,引发莫名的界面卡死、快捷键响应异常问题,直接在自定义UI类里重写
enterEvent即可 - 事件触发时先判断窗口激活状态,已经处于激活状态时直接跳过,避免重复调用激活接口产生性能损耗
- 激活窗口仅调用
activateWindow()方法获取输入焦点,不要加强制置顶、强制抢焦点的全局属性,避免破坏Maya本身的窗口层级逻辑
可直接复用的代码示例
# 注意根据自己用的PyQt/PySide版本调整导入路径,Maya2022+默认搭载PySide2 from PySide2.QtCore import QEvent from PySide2.QtWidgets import QDialog class MyCustomTool(QDialog): def __init__(self, parent=None): super(MyCustomTool, self).__init__(parent) # 下方保留你原有的UI初始化、快捷键绑定逻辑即可 self.init_ui() self.bind_shortcuts() def enterEvent(self, event: QEvent): # 鼠标移入窗口区域时自动激活窗口 if not self.isActiveWindow(): self.activateWindow() # 事件向上透传,不影响窗口内子控件的正常鼠标响应 super(MyCustomTool, self).enterEvent(event)
避坑说明
- 不要给窗口添加
Qt.WindowStaysOnTopHint属性,也不要写定时器循环检测激活窗口,否则还是会出现UI快捷键和Maya原生快捷键全局冲突的问题 - 如果UI中嵌入了Maya原生控件(如视口面板、大纲视图、属性编辑器等),需要给这类子控件调用
setMouseTracking(True)开启鼠标追踪,避免鼠标移到内嵌控件上时enterEvent被子控件拦截,导致窗口激活失效 - 不要在
enterEvent中添加全量UI刷新、窗口位置重置这类重逻辑,否则鼠标快速划过窗口时会出现明显卡顿
内容的提问来源于stack exchange,提问作者Mavla Afa
相关产品推荐
相关产品推荐

